रेंज 1 - 10 में एक यादृच्छिक संख्या उत्पन्न करें


95

जब से मैंने इस प्रश्न पर काम किया था एक परीक्षण क्वेरी के लिए मेरे दृष्टिकोण से काम नहीं किया, मैं अब कुछ और कोशिश कर रहा हूं। क्या random()मुझे 1 और 10 के बीच केवल नंबर प्राप्त करने के लिए pg के फंक्शन को बताने का कोई तरीका है ?

जवाबों:


152

अगर 1 और 10 के बीच की संख्या से आपका मतलब है कि कोई फ्लोट है जो = = 1 और <10 है, तो यह आसान है:

select random() * 9 + 1

इसे आसानी से जांचा जा सकता है:

# select min(i), max(i) from (
    select random() * 9 + 1 as i from generate_series(1,1000000)
) q;
       min       |       max
-----------------+------------------
 1.0000083274208 | 9.99999571684748
(1 row)

यदि आप पूर्णांक चाहते हैं, तो> = 1 और <10 हैं, तो यह सरल है:

select trunc(random() * 9 + 1)

और फिर से, सरल परीक्षण:

# select min(i), max(i) from (
    select trunc(random() * 9 + 1) as i from generate_series(1,1000000)
) q;
 min | max
-----+-----
   1 |   9
(1 row)

ई घटनाओं से चयन तिथि (e.created_at) + (ट्रंक (यादृच्छिक (* * 20)); परिणाम: ERROR: ऑपरेटर मौजूद नहीं है: दिनांक + डबल परिशुद्धता ट्रंक वास्तव में पूर्णांक लौटाता है?
बोगदान गुसिवे

3
trunc()उसी डेटा प्रकार को इनपुट के रूप में देता है (जैसा कि मैनुअल में कहा गया है)। आपको परिणाम को पूर्णांक में trunc(random() * 20)::int
लाना होगा

मुझे आश्चर्य है कि अगर कम से कम सिद्धांत में यह संभव है कि random()एक मान लौटाएगा <1 कि जब 9 से गुणा किया जाता है = = 9 दोहरे सटीक प्रकार की अक्षम्य प्रकृति के कारण ? व्यवहार में भले ही यह संभव हो, 15 अंकों या इतनी सटीकता के कारण यह गायब नहीं होगा।

1
मैं width_bucket(random(), 0, 1, 10)एक विकल्प के रूप में कर रहा हूं

ऐसा लगता है कि मेरी आशंका निर्मूल थी, हालांकि मैं स्वीकार करता हूं कि मैं गणित को बिलकुल नहीं समझता हूं

17

संक्षेप और थोड़ा सरल करने के लिए, आप उपयोग कर सकते हैं:

-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);

और आप @ user80168 द्वारा उल्लिखित इस तरह का परीक्षण कर सकते हैं

-- 0 - 9
SELECT min(i), max(i) FROM (SELECT floor(random() * 10) AS i FROM generate_series(0, 100000)) q;
-- 0 - 10
SELECT min(i), max(i) FROM (SELECT floor(random() * (10 + 1)) AS i FROM generate_series(0, 100000)) q;
-- 1 - 10
SELECT min(i), max(i) FROM (SELECT ceil(random() * 10) AS i FROM generate_series(0, 100000)) q;

2
डॉक्स कहते हैं कि "सीमा 0.0 <= x <1.0 में यादृच्छिक मान", इसलिए वहाँ कम से कम है का एक सैद्धांतिक मौका ceil(random() * 10)0 में जिसके परिणामस्वरूप - मैं करने के लिए छड़ी होगी floor

1
मैं @JackDouglas से सहमत हूं, इसलिए रेंज 1 - 10 के लिए यह होना चाहिएSELECT floor(random() * 10 + 1);
SergiyKolesnikov

9

यदि आप SQL सर्वर का उपयोग कर रहे हैं तो पूर्णांक प्राप्त करने का सही तरीका है

SELECT Cast(RAND()*(b-a)+a as int);

कहाँ पे

  • 'बी' ऊपरी सीमा है
  • 'क' निचली सीमा है

यहां सावधान रहें, यदि आप अपनी निचली सीमा 1 और ऊपरी 10 के रूप में रखते हैं, तो आपको केवल 1-> 9 नंबर मिलेंगे। अन्य उत्तरों से लगता है कि 1 और 10 के बीच का अर्थ 1-> 9 है ... मैं सुझाव दूंगा कि अगर 'के बीच' ऊपरी सीमा को बाहर करता है तो इसे निचले (यानी 2-> 9) को भी छोड़ देना चाहिए। सेलेक्ट कास्ट (रैंड) (* (बी + 1) -ए) + ए इंट);
मोरवेल

इस प्रश्न को स्पष्ट रूप से एक PostgreSQL प्रश्न के रूप में टैग किया गया है।
सेबेस्टियन पाल्मा

4

(trunc (random () * 10)% 10) + 1


त्रुटि: ऑपरेटर मौजूद नहीं है: डबल सटीक% पूर्णांक

1
और आप वैसे भी मापांक का उपयोग क्यों करेंगे? इस तर्क का कोई मतलब नहीं है। यदि आपको कोई "रैपिंग" मिलती है, तो आपके पास समान वितरण नहीं होगा, और यदि आपको कोई नहीं मिलता है, तो आपको इसकी आवश्यकता नहीं है।
एरिक

1

Hythlodayr के उत्तर का सही संस्करण।

-- ERROR:  operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1

से आउटपुट को truncपरिवर्तित करना होगा INTEGER। लेकिन यह बिना किया जा सकता है trunc। तो यह सरल हो जाता है।

select (random() * 9)::INTEGER + 1

[1, 10] रेंज में एक INTEGER आउटपुट उत्पन्न करता है अर्थात दोनों 1 और 10 समावेशी।

किसी भी संख्या (फ़्लोट्स) के लिए, उपयोगकर्ता 80168 का उत्तर देखें। यानी बस इसे बदलने के लिए नहीं है INTEGER


0

वास्तव में मैं नहीं जानता कि आप यह चाहते हैं।

इसे इस्तेमाल करे

INSERT INTO my_table (my_column)
SELECT
    (random() * 10) + 1
;

0

यह संग्रहीत कार्यविधि एक रैंड संख्या को एक तालिका में सम्मिलित करती है। बाहर देखो, यह एक अंतहीन संख्या सम्मिलित करता है। जब पर्याप्त संख्या मिल जाए तो इसे निष्पादित करना बंद कर दें।

कर्सर के लिए एक तालिका बनाएं:

CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL) 

जाओ

अपनी संख्याएँ रखने के लिए एक तालिका बनाएँ:

CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)

SCRIPT में शामिल:

INSERT INTO [SearchIndex]([Cursor])  SELECT N'INSERT INTO ID  SELECT   FLOOR(rand() * 9 + 1)  SELECT COUNT (ID) FROM ID

बनाने और प्रक्रिया को पूरा करने:

CREATE PROCEDURE [dbo].[RandNumbers] AS
BEGIN
Declare  CURSE  CURSOR  FOR (SELECT  [Cursor] FROM [dbo].[SearchIndex]  WHERE [Cursor] IS NOT NULL)
DECLARE @RandNoSscript NVARCHAR (250)
OPEN CURSE
FETCH NEXT FROM CURSE
INTO @RandNoSscript 
WHILE @@FETCH_STATUS IS NOT NULL 
BEGIN
Print @RandNoSscript
EXEC SP_EXECUTESQL @RandNoSscript;  
 END
 END
GO

अपनी तालिका भरें:

EXEC RandNumbers

3
प्रश्न Postgres के बारे में है, न कि SQL Server
a_horse_with_no_name
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.