MYSQL का उपयोग करके एक यादृच्छिक संख्या बना रहा है


95

मैं जानना चाहूंगा कि 100 और 500 के बीच यादृच्छिक रूप से उत्पन्न संख्या का चयन करने का एक तरीका है, एक चुनिंदा क्वेरी के साथ।

उदाहरण के लिए: SELECT name, address, random_number FROM users

मुझे इस नंबर को db में स्टोर नहीं करना है और केवल इसका उपयोग उद्देश्य को प्रदर्शित करने के लिए करना है।

मैंने इसे कुछ इस तरह आज़माया, लेकिन यह काम नहीं कर पाया।

SELECT name, address, FLOOR(RAND() * 500) AS random_number FROM users

आशा है कि कोई मेरी मदद करेगा। धन्यवाद


1
कृपया इस लिंक पर जाएँ stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

जवाबों:


145

यह वह देना चाहिए जो आप चाहते हैं:

FLOOR(RAND() * 401) + 100

सामान्य रूप से, > और समावेशी के FLOOR(RAND() * (<max> - <min> + 1)) + <min>बीच एक संख्या उत्पन्न करता है ।<min<max>

अपडेट करें

यह पूरा बयान काम करना चाहिए:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users

मैं इस कोड का उपयोग कैसे करूं। मैंने इस तरह की कोशिश की - FLOOR (RAND () * 401) + 100 नंबर के रूप में, लेकिन काम नहीं कर रहा
TNK

नोट: मेरे पास मेरे db में 'नंबर' नाम का एक कॉलम नहीं है। यह गतिशील रूप से उत्पन्न कॉलम होना चाहिए। क्या यह सकारात्मक है?
TNK

1
@ ईडियल वास्तव में मुझे लगता है कि round()एक गैर-समान वितरण देगा।
Ja'ck

1
बेहतर परिणाम को एक चर में संग्रहित करें और चर का उपयोग करें यदि आपके पास मास्टर दास प्रतिकृति है। SET @r=FLOOR(RAND() * 401) + 100, तब SELECT @r
कियान चेन

3
RAND(), UUID(), NOW()Indeterministic कार्य हैं। ऐसे कार्यों की कॉलिंग को प्रतिकृति के लिए बिन लॉग में लिखे जाने से बचना चाहिए। उदाहरण के लिए। मास्टर और दास पर क्षेत्रों INSERT INTO t SET ID=UUID();का मूल्य IDभिन्न होगा। इसके बजाय इसे लिखे जाने की जरूरत है SET @uuid:=UUID();, और फिर INSERT INTO t SET ID=@uuid;, उन्हें एक ही लेनदेन में चलाएं। यह प्रतिकृति सुरक्षित होगी। इस प्रश्न के लिए यह थोड़ा सा विषय है। यह नहीं कहता कि आपके उत्तर में कोई समस्या है। :)
कियान चेन

10

जैसा कि RANDएक संख्या का उत्पादन करता है 0 <= v <1.0 ( प्रलेखन देखें ) आपको ROUNDयह सुनिश्चित करने के लिए उपयोग करने की आवश्यकता है कि आप ऊपरी बाउंड (इस मामले में 500) और निचले बाउंड (इस मामले में 100) प्राप्त कर सकते हैं

तो आप की जरूरत रेंज का उत्पादन करने के लिए:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users

इस तरह काम करने वाली कोडिंग - SELECT ROUND (100.0 + 400.0 * RAND ()) random_number के रूप में, लेकिन अब मेरी क्वेरी के साथ काम कर रही है
TNK

random_number कॉलम मेरी क्वेरी के साथ यादृच्छिक रूप से उत्पन्न कॉलम होना चाहिए।
TNK

1
इस विधि से पहली और आखिरी संख्या कम होने की संभावना है।
स्लोबोडन पेजिक

4

इस उत्तर के अतिरिक्त, एक फ़ंक्शन बनाएं जैसे

CREATE FUNCTION myrandom(
    pmin INTEGER,
    pmax INTEGER
)
RETURNS INTEGER(11)
DETERMINISTIC
NO SQL
SQL SECURITY DEFINER
BEGIN
  RETURN floor(pmin+RAND()*(pmax-pmin));
END; 

और कॉल करें

SELECT myrandom(100,300);

यह आपको 100 और 300 के बीच यादृच्छिक संख्या देता है


3

आप FLOOR(RAND() * n) as randnum(n एक पूर्णांक है) का उपयोग करके एक यादृच्छिक संख्या बना सकते हैं , हालांकि यदि आपको दोहराए जाने के लिए समान यादृच्छिक संख्या की आवश्यकता नहीं है, तो आपको कुछ हद तक एक अस्थायी तालिका में संग्रहीत करना होगा। तो आप इसके खिलाफ जांच कर सकते हैं where randnum not in (select * from temptable)...


3

ये दोनों अच्छी तरह से काम कर रहे हैं:

select round(<maxNumber>*rand())

FLOOR(RAND() * (<max> - <min> + 1)) + <min> // generates a number
between <min> and <max> inclusive.

0

यह पूर्ण सूत्र है कि पूर्णांकों iको jकहां से कहां तक खोजना हैi <= R <= j

FLOOR(min+RAND()*(max-min))

3
यह गलत है, यह कभी भी जम्मू (या अधिकतम) का उत्पादन नहीं करेगा। यह एक संख्या i <= R <j पैदा करता है।
jlh

1
होना चाहिए:FLOOR(min+RAND()*(max-min+1))
डेविड रोड्रिग्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.