1 - 10 সীমাতে একটি এলোমেলো সংখ্যা তৈরি করুন


99

যেহেতু এই প্রশ্নটিতে আমি যে পরীক্ষার প্রশ্নের জন্য কাজ করেছি সে সম্পর্কে আমার দৃষ্টিভঙ্গি কার্যকর হয়নি, এখন আমি অন্য কিছু চেষ্টা করছি। random()আমার কাছে কেবল 1 থেকে 10 এর মধ্যে নম্বর পাওয়ার জন্য পিজির ফাংশনটি বলার উপায় আছে ?

উত্তর:


159

যদি 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)) নির্বাচন করুন e; ফলাফল: ত্রুটি: অপারেটরটির অস্তিত্ব নেই: তারিখ + ডাবল স্পষ্টতা ট্রানস কি সত্যিই পূর্ণসংখ্যা ফেরত দেয়?
বোগদান গুসিভ

4
trunc()ইনপুট হিসাবে একই তথ্য টাইপ ফেরত দেয় (ম্যানুয়াল হিসাবে বর্ণিত)। আপনাকে ফলাফলটি পূর্ণসংখ্যায় ফেলতে হবে:trunc(random() * 20)::int
a_horse_with_no_name

আমি ভাবছি যদি কমপক্ষে তত্ত্বে এটি সম্ভব random()হয় তবে ডাবল স্পষ্টতা ধরণের নিখুঁত প্রকৃতির কারণে <1 যা 9 দ্বারা গুণিত হয় তখন = = 9 হবে ? অনুশীলনে এমনকি যদি এটি সম্ভব হয় তবে এটি অবশ্যই 15 টি সংখ্যার বা এত নির্ভুলতার কারণে অদৃশ্যভাবে অসম্ভব be

4
আমি width_bucket(random(), 0, 1, 10)বিকল্প হিসাবে সাথে যাচ্ছি

দেখে মনে হচ্ছে আমার ভয়টি ভিত্তিহীন ছিল যদিও আমি স্বীকার করি আমি গণিতগুলি একেবারেই বুঝতে পারি না :-)

18

সংক্ষিপ্তসার এবং কিছুটা সহজ করার জন্য, আপনি ব্যবহার করতে পারেন:

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

এবং আপনি @ ব্যবহারকারী 80168 দ্বারা উল্লিখিত এর মতো পরীক্ষা করতে পারেন

-- 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;

4
ডক্স বলে "পরিসর 0.0 <= এক্স <1.0 র্যান্ডম মান", তাই অন্তত হয় একটি তাত্ত্বিক সম্ভাবনা ceil(random() * 10)0 ফলে - আমি বিদ্ধ হবে floor

4
আমি @ জ্যাকডুগলাসের সাথে একমত, তাই 1 - 10 এর ব্যাপ্তির জন্য এটি হওয়া উচিতSELECT floor(random() * 10 + 1);
সের্গি কোলেস্নিকভ

9

আপনি যদি এসকিউএল সার্ভার ব্যবহার করেন তবে পূর্ণসংখ্যার সঠিক উপায়টি হ'ল

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

কোথায়

  • 'খ' হ'ল উপরের সীমা
  • 'ক' হ'ল নিম্ন সীমা

এখানে সতর্কতা অবলম্বন করুন, আপনি যদি নিজের নিম্ন সীমাটিকে 1 এবং উচ্চ হিসাবে 10 হিসাবে রাখেন তবে আপনি কেবল 1-> 9 নম্বর পাবেন। অন্যান্য উত্তরগুলি মনে হয় যে 1 এবং 10 এর মধ্যে অর্থ 1-> 9 ... আমি সুপারিশ করব যদি 'এর মধ্যে' উপরের সীমাটি বাদ দেয় তবে এটি নীচের অংশটিকেও বাদ দিতে হবে (যেমন 2-> 9)। সিলেক্ট কাস্ট (RAND () * ((খ + 1) -এ) + এন্ট্রি ইন);
মরভেল

প্রশ্নটি পোস্টগ্রিএসকিউএল প্রশ্ন হিসাবে স্পষ্টভাবে ট্যাগ করা আছে।
সেবাস্তিয়ান পালমা

4

(ট্রাঙ্ক (এলোমেলো () * 10)% 10) + 1


ত্রুটি: অপারেটরটির অস্তিত্ব নেই: ডাবল নির্ভুলতা% পূর্ণসংখ্যা

4
এবং কেন আপনি যাইহোক মডুলাস ব্যবহার করবেন? এই যুক্তিটির কোনও অর্থ নেই। যদি আপনি কোনও "মোড়ানো" পান তবে আপনার সমান বন্টন হবে না এবং যদি আপনি কিছু না পান তবে আপনার এটির দরকার নেই।
এরিক

1

হিথলডায়ারের উত্তরের সঠিক সংস্করণ।

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

থেকে আউটপুট truncরূপান্তর করতে হবে INTEGER। তবে তা ছাড়াও করা যায় trunc। সুতরাং এটি সহজ হতে দেখা যাচ্ছে।

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

পরিসীমাতে একটি INTEGER আউটপুট উত্পন্ন করে [1, 10] অর্থাৎ 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)

লিপি লিখুন:

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

4
প্রশ্নটি এসকিউএল সার্ভার নয়,
পোস্টগ্রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.