3 से 6 तक यादृच्छिक अंतर मान उत्पन्न करें


101

क्या माइक्रोसॉफ्ट एसक्यूएल सर्वर में मिन से मैक्स (3-9 उदाहरण, 15-99 आदि) से यादृच्छिक अंतर मूल्य उत्पन्न करना संभव है

मुझे पता है, मैं 0 से अधिकतम तक उत्पन्न कर सकता हूं, लेकिन न्यूनतम सीमा कैसे बढ़ाऊं?

यह क्वेरी 1 से 6 तक यादृच्छिक मान उत्पन्न करती है। इसे 3 से 6 तक बदलने की आवश्यकता है।

SELECT table_name, 1.0 + floor(6 * RAND(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables

बाद में 5 सेकंड जोड़ा गया :

मूर्खतापूर्ण प्रश्न, क्षमा करें ...

SELECT table_name, 3.0 + floor(4 * RAND(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables

1
आपके पास वहां मौजूद उत्तर केवल तभी काम करता है जब आपके पास तालिका पर व्यवस्थापक प्रकार की अनुमति हो। जिस तरह से मुझे इसके आसपास मिला वह बीज के रूप में क्षेत्र पर प्राथमिक कुंजी का उपयोग करके था। वितरण शानदार नहीं था, लेकिन इसने उद्देश्य को पूरा किया।
छाया

जवाबों:


196

यह 0-9 के बीच एक यादृच्छिक संख्या उत्पन्न करता है

SELECT ABS(CHECKSUM(NEWID()) % 10)

6 के माध्यम से 1

SELECT ABS(CHECKSUM(NEWID()) % 6) + 1

6 के माध्यम से 3

SELECT ABS(CHECKSUM(NEWID()) % 4) + 3

डायनेमिक (ईलर्ट हेजेलमेथ्स टिप्पणी के आधार पर)

SELECT ABS(CHECKSUM(NEWID()) % (@max - @min + 1)) + @min

टिप्पणियों के आधार पर अद्यतन:

  • NEWID यादृच्छिक स्ट्रिंग उत्पन्न करता है (बदले में प्रत्येक पंक्ति के लिए)
  • CHECKSUM स्ट्रिंग का मूल्य लेता है और संख्या बनाता है
  • मापांक ( %) उस संख्या से विभाजित होता है और शेष को लौटाता है (मतलब अधिकतम मूल्य आपके द्वारा उपयोग की जाने वाली संख्या से कम है)
  • ABS सकारात्मक परिणामों को सकारात्मक में बदलता है
  • फिर 0 परिणाम को समाप्त करने के लिए एक में जोड़ें (एक पासा रोल अनुकरण करने के लिए)

2
यह मुझे एक टन में मदद मिली! बस याद रखें कि यदि आप थोक आवेषण के लिए यादृच्छिक कुंजी उत्पन्न करने का प्रयास कर रहे हैं तो इससे डुप्लिकेट बन सकते हैं और कुछ कथन विफल हो जाएंगे। लेकिन आपका शुक्रिया!
निकोलस

3
अगर मुझे 1 और 27 के बीच यादृच्छिक संख्या उत्पन्न करनी हो तो क्या होगा? यानी रेंज 9 से अधिक है?
somegeek

4
अगर मैं तर्क का पालन कर रहा हूं तो ऐसा लगता है कि यह ट्वीक आपको गतिशील रूप से आसानी से सीमा निर्धारित करने देगा। ABS(CHECKSUM(NEWID()) % (@max - @min + 1)) + @min। मेरी ओर से कुछ परीक्षणों से अच्छे परिणाम मिले। यदि यह वास्तव में सटीक है, तो मुझे लगता है कि इस उत्तर को इसमें शामिल करके थोड़ा सुधार किया जा सकता है।
इलर्ट हेजेलमेथ

13

मैं देख रहा हूँ कि आपने SQL Server 2008 में आपके प्रश्न का उत्तर जोड़ दिया है

SELECT 3 + CRYPT_GEN_RANDOM(1) % 4 /*Random number between 3 and 6*/ 
FROM ...

इस पद्धति के कुछ नुकसान हैं

  1. यह NEWID()विधि की तुलना में धीमी है
  2. भले ही इसका मूल्यांकन प्रति पंक्ति एक बार किया जाता है, लेकिन क्वेरी ऑप्टिमाइज़र को इसका एहसास नहीं होता है जिससे विषम परिणाम हो सकते हैं

लेकिन बस सोचा था कि मैं इसे दूसरे विकल्प के रूप में जोड़ूंगा।


1
@ FSou1 - हाँ। मुझे लगता CRYPT_GEN_RANDOMहै कि उन स्थितियों के लिए वास्तव में इरादा है जहां आपको अधिक क्रिप्टोग्राफिक रूप से सुरक्षित छद्म यादृच्छिक संख्या की आवश्यकता होती है।
मार्टिन स्मिथ

7

तुम यह केर सकते हो:

DECLARE @maxval TINYINT, @minval TINYINT
select @maxval=24,@minval=5

SELECT CAST(((@maxval + 1) - @minval) *
    RAND(CHECKSUM(NEWID())) + @minval AS TINYINT)

और वह सीधे इस लिंक से लिया गया था , मैं वास्तव में नहीं जानता कि इस उत्तर के लिए उचित क्रेडिट कैसे दूं।


5

पिनाल डेव की साइट से अच्छा और सरल:

http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 3 ---- The lowest random number
SET @Upper = 7 ---- One more than the highest random number
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random

(मैंने ऊपरी संख्या को शामिल करने के लिए @ ऊपरी में थोड़ा बदलाव किया, 1. जोड़ा)


इसका उदाहरण मैंने एक और पोस्टिंग में देखा। यह एक यादृच्छिक वितरण प्रदान नहीं करता है। उदाहरण के लिए, लोअर 1 है और अपर 11 है, इसलिए मुझे 1 से 10. तक यादृच्छिक संख्याएँ चाहिए। 1 और 10 को 2-8 के रूप में आधी घटनाएँ मिलती हैं। जाओ और इसका परीक्षण करो।
नैनोनर्ड

4

सीधे शब्दों में:

DECLARE @MIN INT=3; --We define minimum value, it can be generated.
DECLARE @MAX INT=6; --We define maximum value, it can be generated.

SELECT @MIN+FLOOR((@MAX-@MIN+1)*RAND(CONVERT(VARBINARY,NEWID()))); --And then this T-SQL snippet generates an integer between minimum and maximum integer values.

आप अपनी आवश्यकताओं के लिए इस कोड को बदल सकते हैं और संपादित कर सकते हैं।


1
जब भी यह कोड स्निपेट का स्वागत है, और कुछ मदद प्रदान कर सकता है, तो यह बहुत सुधार होगा यदि इसमें इस सवाल का विवरण शामिल है कि यह कैसे पता करता है। इसके बिना, आपके उत्तर का शैक्षिक मूल्य बहुत कम है - याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है! कृपया स्पष्टीकरण जोड़ने के लिए अपना उत्तर संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
टोबे स्पाइट

4

यहाँ कोड की सरल और एकल पंक्ति है

इसके लिए SQL Inbuild RAND () फ़ंक्शन का उपयोग करें।

यहाँ दो नंबर (RETURN INT रेंज) के बीच यादृच्छिक संख्या उत्पन्न करने का सूत्र है

यहाँ एक आपका पहला नंबर (न्यूनतम) है और बी रेंज में दूसरा नंबर (अधिकतम) है

SELECT FLOOR(RAND()*(b-a)+a)

नोट: INT रेंज नंबर प्राप्त करने के लिए आप CAST या CONVERT फ़ंक्शन का उपयोग कर सकते हैं।

(CAST (RAND) (* (25-10) +10 AS INT))

उदाहरण:

SELECT FLOOR(RAND()*(25-10)+10);

यहाँ दो नंबर (RETURN DECIMAL रेंज) के बीच यादृच्छिक संख्या उत्पन्न करने का सूत्र है

SELECT RAND()*(b-a)+a;

उदाहरण:

SELECT RAND()*(25-10)+10;

अधिक जानकारी के लिए इसे देखें: https://www.techonthenet.com/sql_server/functions/rand.php


1
ध्यान दें, जैसा कि लिंक किए गए लेख में बताया गया है, यह वास्तव में मान = मैक्स उत्पन्न नहीं करेगा। मूल्यों के लिए उदाहरण के लिए ऐसा करने के लिए> = 10 और <= 25 आपको SELO FLOOR (RAND) (* (25-10 + 1)) + 10
Shaun

1
SELECT ROUND((6 - 3 * RAND()), 0)

2
एक संख्या को दूसरे पर प्राप्त करने का मौका समान रूप से नहीं फैलता है। इसका आउटपुट चेक करें: SELECT ROUND((6 - 3 * 0.16), 0) SELECT ROUND((6 - 3 * 0.17), 0) SELECT ROUND((6 - 3 * 0.5), 0) SELECT ROUND((6 - 3 * 0.51), 0) SELECT ROUND((6 - 3 * 0.83), 0) SELECT ROUND((6 - 3 * 0.84), 0) दिखाता है कि 6 के लिए 16% परिवर्तन, ~ 34% यह 5 है, ~ 34% यह 4 है और ~ 16% यह 3. है
माइक डी क्लार्क

truncating राउंडिंग से बेहतर है
माइकलचिरिको

0

एक समारोह के रूप में लामक का जवाब:

-- Create RANDBETWEEN function
-- Usage: SELECT dbo.RANDBETWEEN(0,9,RAND(CHECKSUM(NEWID())))
CREATE FUNCTION dbo.RANDBETWEEN(@minval TINYINT, @maxval TINYINT, @random NUMERIC(18,10))
RETURNS TINYINT
AS
BEGIN
  RETURN (SELECT CAST(((@maxval + 1) - @minval) * @random + @minval AS TINYINT))
END
GO

0
DECLARE @min INT = 3;
DECLARE @max INT = 6;
SELECT @min + ROUND(RAND() * (@max - @min), 0);

क्रमशः

DECLARE @min INT = 3;
DECLARE @max INT = 6;

DECLARE @rand DECIMAL(19,4) = RAND();
DECLARE @difference INT = @max - @min;
DECLARE @chunk INT = ROUND(@rand * @difference, 0);
DECLARE @result INT = @min + @chunk; 
SELECT @result;

ध्यान दें कि उपयोगकर्ता-परिभाषित फ़ंक्शन इस प्रकार रैंड () का उपयोग करने की अनुमति नहीं देता है। इसके लिए वर्कअराउंड (स्रोत: http://blog.sqlauthority.com/2012/11/20/sql-server-using-rand-in-user-defined-functions-udf/ ) पहले एक दृश्य बनाना है।

CREATE VIEW [dbo].[vw_RandomSeed]
AS
SELECT        RAND() AS seed

और फिर यादृच्छिक फ़ंक्शन बनाएं

CREATE FUNCTION udf_RandomNumberBetween
(
    @min INT,
    @max INT
)
RETURNS INT
AS
BEGIN
    RETURN @min + ROUND((SELECT TOP 1 seed FROM vw_RandomSeed) * (@max - @min), 0);
END

0

सामान्य रूप में:

select rand()*(@upper-@lower)+@lower;

आपके प्रश्न के लिए:

select rand()*(6-3)+3;

<=>

select rand()*3+3;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.