3 থেকে 6 এলোমেলো ইনট মান তৈরি করুন


104

মাইক্রোসফ্ট এসকিউএল সার্ভারে মিন থেকে ম্যাক্স পর্যন্ত এলোমেলো মান মান উত্পন্ন করা সম্ভব (3-9 উদাহরণস্বরূপ, 15-99 ইত্যাদি)

আমি জানি, আমি 0 থেকে সর্বোচ্চ পর্যন্ত জেনারেট করতে পারি, তবে কীভাবে ন্যূনতম সীমানা বাড়ানো যায়?

এই ক্যোয়ারী 1 থেকে 6 এলোমেলো মান উত্পন্ন করে। থেকে 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

4
আপনার কাছে থাকা উত্তরটি কেবলমাত্র যদি আপনার টেবিলে প্রশাসক প্রকারের অনুমতি থাকে তবে তা কার্যকর হয়। ক্ষেত্রের প্রাথমিক কীটি বীজ হিসাবে ব্যবহার করে আমি এর আশেপাশে যেভাবে এসেছি। বিতরণ উজ্জ্বল ছিল না, তবে এটি উদ্দেশ্যটি কার্যকর করেছিল।
শেডো

উত্তর:


200

এটি 0-9 এর মধ্যে একটি এলোমেলো সংখ্যা উত্পন্ন করে

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

1 এর মাধ্যমে 6

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

3 মাধ্যমে 6

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

ডায়নামিক (আইলার্ট জেলমেথস মন্তব্যের উপর ভিত্তি করে)

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

মন্তব্যের ভিত্তিতে আপডেট হয়েছে:

  • NEWID এলোমেলো স্ট্রিং উত্পন্ন করে (বিনিময়ে প্রতিটি সারির জন্য)
  • CHECKSUM স্ট্রিংয়ের মান নেয় এবং সংখ্যা তৈরি করে
  • মডুলাস ( %) সেই সংখ্যা দ্বারা ভাগ করে দেয় এবং অবশিষ্টটিকে ফেরত দেয় (যার অর্থ সর্বাধিক মান আপনি যে সংখ্যার ব্যবহার করেন তার চেয়ে কম)
  • ABS নেতিবাচক ফলাফলকে ইতিবাচক করে তোলে
  • তারপরে 0 টি ফলাফল (ডাইস রোলের সিমুলেট করার জন্য) ফলাফলগুলিতে একটি যুক্ত করুন

4
এটি আমাকে এক টন সাহায্য করেছিল! কেবল মনে রাখবেন আপনি যদি বাল্ক সন্নিবেশগুলির জন্য এলোমেলো কী উত্পন্ন করার চেষ্টা করছেন তবে এটি সদৃশ হতে পারে এবং কিছু বিবৃতি ব্যর্থ হবে। কিন্তু আপনাকে ধন্যবাদ!
নিক্লাস

4
1 থেকে 27 এর মধ্যে যদি আমাকে এলোমেলো সংখ্যা তৈরি করতে হয় তবে কী হবে? অর্থাৎ 9 এর চেয়ে বেশি রেঞ্জ?
somegeek

4
আমি যদি যুক্তি অনুসরণ করছি তবে মনে হচ্ছে এই টুইটটি আপনাকে সঠিকভাবে পরিসীমাটি সহজেই সেট করতে দেয়। ABS(CHECKSUM(NEWID()) % (@max - @min + 1)) + @min। আমার দিক থেকে কয়েকটি পরীক্ষা ভাল ফলাফল পেয়েছে। যদি সত্যই সঠিক হয় তবে আমি মনে করি এই উত্তরটি অন্তর্ভুক্ত করে কিছুটা উন্নতি করা যেতে পারে।
ইয়েলার্ট হেল্মিসেথ

13

আমি দেখতে পাচ্ছি যে এসকিউএল সার্ভার ২০০৮ এ আপনি নিজের প্রশ্নের উত্তর যুক্ত করেছেন আপনি এটিও করতে পারেন

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

এই পদ্ধতির কয়েকটি অসুবিধা হ'ল

  1. এটি NEWID()পদ্ধতির চেয়ে ধীর
  2. যদিও এটি প্রতি সারিতে একবার মূল্যায়ন করা হয় ক্যোরি অপ্টিমাইজার এটি উপলব্ধি করতে পারে না যা বিজোড় ফলাফলের দিকে নিয়ে যেতে পারে

তবে কেবল ভেবেছিলাম আমি এটিকে অন্য বিকল্প হিসাবে যুক্ত করব।


4
@ এফএসউ 1 - হ্যাঁ আমি মনে করি CRYPT_GEN_RANDOMসত্যিকারের পরিস্থিতিগুলির জন্য যেখানে আপনার আরও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত সিউডো র্যান্ডম সংখ্যার প্রয়োজন need
মার্টিন স্মিথ

7

তুমি এটি করতে পারো:

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

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

এবং এটি এই লিঙ্কটি থেকে সরাসরি নেওয়া হয়েছিল , আমি এই উত্তরটির যথাযথ ক্রেডিট দিতে কীভাবে জানি না know


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 এবং উচ্চতর 11 টি তাই আমি 1 থেকে 10 পর্যন্ত র্যান্ডম সংখ্যা চাই The যাও এবং এটি পরীক্ষা করে দেখুন।
ন্যানোনার্ড

5

কেবল:

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.

আপনার প্রয়োজনের জন্য আপনি এই কোডটি পরিবর্তন এবং সম্পাদনা করতে পারেন।


4
যতক্ষণ এই কোড স্নিপেট স্বাগত, এবং কিছু সাহায্য প্রদান করতে পারে, এটা হবে ব্যাপকভাবে উন্নত যদি এটা একটি ব্যাখ্যা অন্তর্ভুক্ত এর কিভাবে এটা প্রশ্নের ঠিকানাগুলি। তা ছাড়া, আপনার উত্তরের শিক্ষাগত মূল্য অনেক কম রয়েছে - মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখন যে ব্যক্তি জিজ্ঞাসা করছেন তা নয়! দয়া করে ব্যাখ্যা যুক্ত করতে আপনার উত্তর সম্পাদনা করুন, এবং কোন সীমাবদ্ধতা এবং অনুমানগুলি প্রযোজ্য তা একটি ইঙ্গিত দিন।
টবি স্পিড

4

এখানে কোডের সহজ এবং একক লাইন

এটির জন্য এসকিউএল ইনবিল্ড র‌্যান্ড () ব্যবহার করুন ফাংশনটি ব্যবহার করুন।

এখানে দুটি সংখ্যার (রিটার্ন INT রেঞ্জ) এর মধ্যে এলোমেলো সংখ্যা তৈরি করার সূত্রটি দেওয়া হচ্ছে

এখানে একটি আপনার প্রথম সংখ্যা (ন্যূনতম) এবং বি রেঞ্জের দ্বিতীয় সংখ্যা (সর্বাধিক)

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

দ্রষ্টব্য: আপনি INT রেঞ্জ নম্বর পেতে CAST বা কনভার্ট ফাংশনটিও ব্যবহার করতে পারেন।

(কাস্ট (র‌্যান্ড () * (25-10) +10 হিসাবে INT))

উদাহরণ:

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

দুটি সংখ্যার (ডিসিডিমাল রেঞ্জ প্রত্যাবর্তন) এর মধ্যে এলোমেলো সংখ্যা তৈরি করার সূত্রটি এখানে is

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

উদাহরণ:

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

আরও বিশদ এটি পরীক্ষা করুন: https://www.techonthenet.com/sql_server/funitions/rand.php


4
দ্রষ্টব্য, লিঙ্কযুক্ত নিবন্ধে উল্লিখিত হিসাবে এটি আসলে মানগুলি তৈরি করবে না = সর্বোচ্চ। উদাহরণস্বরূপ মানগুলি = = 10 এবং <= 25 এর জন্য এটি করার জন্য আপনার পছন্দগুলি নির্বাচন করুন (RAND () * (25-10 + 1)) + 10
শান

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

4
অন্যটির চেয়ে একটি নম্বর পাওয়ার সুযোগটি সমানভাবে ছড়িয়ে যায় না। এর আউটপুট পরীক্ষা করুন: 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
মাইক ডি ক্লার্ক

কাটাকাটি রাউন্ডিংয়ের চেয়ে সেরা
মাইকেলচিরিকো

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;

নোট করুন যে কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশন এইভাবে RAND () ব্যবহারের অনুমতি দেয় না। এর জন্য একটি সূত্র (উত্স: http://blog.sqlauthority.com/2012/11/20/sql-server- using-rand-in-user-defined-funtions- 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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.