1-10 aralığında rastgele bir sayı oluşturun


99

Bu soruda üzerinde çalıştığım bir test sorgusu için yaklaşımım işe yaramadığından, şimdi başka bir şey deniyorum. Pg random()işlevinin bana yalnızca 1 ile 10 arasındaki sayıları vermesini söylemenin bir yolu var mı ?

Yanıtlar:


160

1 ile 10 arasındaki sayılarla> = 1 ve <10 olan herhangi bir float'ı kastediyorsanız, o zaman kolaydır:

select random() * 9 + 1

Bu, aşağıdakilerle kolayca test edilebilir:

# 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 ve <10 olan tam sayılar istiyorsanız, o zaman basit:

select trunc(random() * 9 + 1)

Ve yine, basit test:

# 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)

olaylardan tarih (e.created_at) + (trunc (random () * 20)) seçin e; sonuç: HATA: işleç yok: tarih + çift duyarlık Kesmek gerçekten tamsayılar mı döndürüyor?
Bogdan Gusiev

3
trunc()girişle aynı veri türünü döndürür (kılavuzda belirtildiği gibi). trunc(random() * 20)::int
Sonucu

Merak ediyorum, en azından teoride , çift kesinlik türünün kesin olmayan doğasırandom() nedeniyle, 9 ile çarpıldığında> = 9 olacak şekilde <1 değerini döndürebilecek mi? Uygulamada, mümkün olsa bile, 15 basamak kadar hassasiyet nedeniyle, elbette yok olma olasılığı düşüktür.

1
Ben oynuyor ediyorum width_bucket(random(), 0, 1, 10)alternatif olarak

Korkularım temelsizmiş gibi görünüyor , ancak itiraf

18

Özetlemek ve biraz basitleştirmek için şunları kullanabilirsiniz:

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

Ve bunu @ user80168 tarafından belirtildiği gibi test edebilirsiniz.

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

2
Docs demek "aralık 0.0 <= x <1.0 rastgele değer", yani en azından bir teorik şans var ceil(random() * 10)0 sonuçlanan - ı sadık kalacağına floor.

1
@JackDouglas'a katılıyorum, bu nedenle 1-10 aralığı için bu olmalıdırSELECT floor(random() * 10 + 1);
SergiyKolesnikov

10

SQL Server kullanıyorsanız tamsayı almanın doğru yolu

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

Nerede

  • 'b' üst sınırdır
  • 'a' alt sınırdır

Burada dikkatli olun, alt sınırınızı 1 ve üstünü 10 olarak belirlerseniz, yalnızca 1-> 9 sayılarını alırsınız. Diğer yanıtlar, 1 ile 10 arasında 1-> 9 anlamına geldiğini varsayıyor gibi görünüyor ... Eğer 'arasında' üst sınırı dışlıyorsa, alt sınırı da dışlamalıdır (yani 2-> 9). SELECT Cast (RAND () * ((b + 1) -a) + a int olarak);
Morvael

Soru açıkça bir PostgreSQL sorusu olarak etiketlenmiştir.
Sebastian Palma

4

(kısa (rastgele () * 10)% 10) + 1


HATA: operatör mevcut değil: çift duyarlıklı% tamsayı

1
Ve neden modülüs kullanasınız ki? Bu mantık mantıklı değil. Eğer herhangi bir "paket" alırsanız, eşit dağıtıma sahip olmayacaksınız ve hiç alamazsanız, o zaman buna ihtiyacınız yok.
ErikE

1

Hythlodayr'ın cevabının doğru versiyonu.

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

Kaynağından gelen çıktı truncdönüştürülmelidir INTEGER. Ama onsuz da yapılabilir trunc. Yani basit olduğu ortaya çıkıyor.

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

[1, 10] aralığında bir INTEGER çıkışı üretir, yani hem 1 hem de 10 dahil.

Herhangi bir sayı (kayan) için user80168'in cevabına bakın. yani sadece onu dönüştürmeyin INTEGER.


0

Aslında bunu istediğini bilmiyorum.

bunu dene

INSERT INTO my_table (my_column)
SELECT
    (random() * 10) + 1
;

0

Bu saklı yordam, tabloya bir rand numarası ekler. Dikkat edin, sonsuz sayılar ekler. Yeterli sayıda numara aldığınızda yürütmeyi bırakın.

imleç için bir tablo oluşturun:

CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL) 

GİT

Numaralarınızı içerecek bir tablo oluşturun:

CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)

Senaryoyu Girmek:

INSERT INTO [SearchIndex]([Cursor])  SELECT N'INSERT INTO ID  SELECT   FLOOR(rand() * 9 + 1)  SELECT COUNT (ID) FROM ID

PROSEDÜRÜN YARATILMASI VE UYGULANMASI:

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

Masanızı doldurun:

EXEC RandNumbers

3
Soru SQL Server değil, Postgres ile ilgili
a_horse_with_no_name
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.