Karena pendekatan saya untuk pertanyaan tes yang saya kerjakan dalam pertanyaan ini tidak berhasil, saya mencoba sesuatu yang lain sekarang. Apakah ada cara untuk mengetahui random()
fungsi pg agar saya hanya mendapatkan angka antara 1 dan 10?
Karena pendekatan saya untuk pertanyaan tes yang saya kerjakan dalam pertanyaan ini tidak berhasil, saya mencoba sesuatu yang lain sekarang. Apakah ada cara untuk mengetahui random()
fungsi pg agar saya hanya mendapatkan angka antara 1 dan 10?
Jawaban:
Jika dengan angka antara 1 dan 10 yang Anda maksud adalah float yang> = 1 dan <10, maka mudah saja:
select random() * 9 + 1
Ini dapat dengan mudah diuji dengan:
# 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)
Jika Anda menginginkan bilangan bulat, yaitu> = 1 dan <10, caranya sederhana:
select trunc(random() * 9 + 1)
Dan lagi, tes sederhana:
# 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()
mengembalikan tipe data yang sama dengan input (seperti yang dinyatakan di manual). Anda perlu mentransmisikan hasilnya ke integer:trunc(random() * 20)::int
random()
akan mengembalikan nilai <1 yang bila dikalikan dengan 9 akan> = 9 karena sifat tidak tepat dari tipe presisi ganda ? Dalam prakteknya bahkan jika mungkin itu akan menjadi sangat tidak mungkin tentu saja karena presisi 15 digit atau lebih.
Untuk meringkas dan sedikit menyederhanakan, Anda dapat menggunakan:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
Dan Anda dapat menguji ini seperti yang disebutkan oleh @ user80168
-- 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)
menghasilkan 0 - Aku akan tetap floor
.
SELECT floor(random() * 10 + 1);
Jika Anda menggunakan SQL Server maka cara yang benar untuk mendapatkan integer adalah
SELECT Cast(RAND()*(b-a)+a as int);
Dimana
(trunc (random () * 10)% 10) + 1
Versi jawaban hythlodayr yang benar.
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
Keluaran dari trunc
harus diubah menjadi INTEGER
. Tapi itu bisa dilakukan tanpa trunc
. Jadi ternyata sederhana.
select (random() * 9)::INTEGER + 1
Menghasilkan keluaran INTEGER dalam kisaran [1, 10] yaitu 1 & 10 inklusif.
Untuk nomor apa pun (float), lihat jawaban pengguna80168. yaitu jangan mengubahnya menjadi INTEGER
.
Sebenarnya saya tidak tahu Anda ingin ini.
coba ini
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
Prosedur tersimpan ini memasukkan nomor rand ke dalam tabel. Awas, itu memasukkan nomor yang tak ada habisnya. Berhenti mengeksekusinya ketika Anda mendapatkan cukup nomor.
buat tabel untuk kursor:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
PERGILAH
Buat tabel untuk memuat nomor Anda:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
MEMASUKKAN SKRIP:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(rand() * 9 + 1) SELECT COUNT (ID) FROM ID
MEMBUAT DAN MELAKSANAKAN PROSEDUR:
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
Isi tabel Anda:
EXEC RandNumbers