যেহেতু এই প্রশ্নটিতে আমি যে পরীক্ষার প্রশ্নের জন্য কাজ করেছি সে সম্পর্কে আমার দৃষ্টিভঙ্গি কার্যকর হয়নি, এখন আমি অন্য কিছু চেষ্টা করছি। random()
আমার কাছে কেবল 1 থেকে 10 এর মধ্যে নম্বর পাওয়ার জন্য পিজির ফাংশনটি বলার উপায় আছে ?
যেহেতু এই প্রশ্নটিতে আমি যে পরীক্ষার প্রশ্নের জন্য কাজ করেছি সে সম্পর্কে আমার দৃষ্টিভঙ্গি কার্যকর হয়নি, এখন আমি অন্য কিছু চেষ্টা করছি। random()
আমার কাছে কেবল 1 থেকে 10 এর মধ্যে নম্বর পাওয়ার জন্য পিজির ফাংশনটি বলার উপায় আছে ?
উত্তর:
যদি 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)
trunc()
ইনপুট হিসাবে একই তথ্য টাইপ ফেরত দেয় (ম্যানুয়াল হিসাবে বর্ণিত)। আপনাকে ফলাফলটি পূর্ণসংখ্যায় ফেলতে হবে:trunc(random() * 20)::int
random()
হয় তবে ডাবল স্পষ্টতা ধরণের নিখুঁত প্রকৃতির কারণে <1 যা 9 দ্বারা গুণিত হয় তখন = = 9 হবে ? অনুশীলনে এমনকি যদি এটি সম্ভব হয় তবে এটি অবশ্যই 15 টি সংখ্যার বা এত নির্ভুলতার কারণে অদৃশ্যভাবে অসম্ভব be
সংক্ষিপ্তসার এবং কিছুটা সহজ করার জন্য, আপনি ব্যবহার করতে পারেন:
-- 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;
ceil(random() * 10)
0 ফলে - আমি বিদ্ধ হবে floor
।
SELECT floor(random() * 10 + 1);
আপনি যদি এসকিউএল সার্ভার ব্যবহার করেন তবে পূর্ণসংখ্যার সঠিক উপায়টি হ'ল
SELECT Cast(RAND()*(b-a)+a as int);
কোথায়
(ট্রাঙ্ক (এলোমেলো () * 10)% 10) + 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
।
এই সঞ্চিত প্রক্রিয়াটি একটি টেবিলের মধ্যে একটি র্যাঙ্ক নম্বর সন্নিবেশ করে। দেখুন, এটি একটি অন্তহীন সংখ্যা সন্নিবেশ করায়। আপনি পর্যাপ্ত নম্বর পেলে এটি চালানো বন্ধ করুন।
কার্সারের জন্য একটি সারণী তৈরি করুন:
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