MYSQL kullanarak rastgele bir sayı oluşturmak


98

Seçme sorgusu ile birlikte 100 ile 500 arasında rastgele oluşturulmuş bir sayıyı seçmenin bir yolu olup olmadığını bilmek isterim.

Örneğin: SELECT name, address, random_number FROM users

Bu numarayı db'de saklamak zorunda değilim ve sadece bunu göstermek için kullanıyorum.

Böyle bir şey denedim ama işe yaramıyor ..

SELECT name, address, FLOOR(RAND() * 500) AS random_number FROM users

Umarım biri bana yardım eder. teşekkür ederim


1
Lütfen bu bağlantıyı ziyaret edin stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

Yanıtlar:


149

Bu istediğini vermeli:

FLOOR(RAND() * 401) + 100

Genel olarak, > ile kapsayıcı FLOOR(RAND() * (<max> - <min> + 1)) + <min>arasında bir sayı üretir .<min<max>

Güncelleme

Bu tam ifade çalışmalıdır:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users

bu kodu nasıl kullanıyorum. Bunu denedim - KAT (RAND () * 401) + 100 numara, ancak çalışmıyor
TNK

NOT: Veritabanımda 'sayı' adlı bir sütunum yok. Bu, dinamik olarak oluşturulmuş bir sütun olmalıdır. mümkün mü
TNK

1
@EdHeal Aslında round()tek tip olmayan bir dağılım vereceğini düşünüyorum .
Ja͢ck

1
Sonucu bir değişkene daha iyi depolayın ve ana bağımlı replikasyonunuz varsa değişkeni kullanın. SET @r=FLOOR(RAND() * 401) + 100, sonra SELECT @r.
Qian Chen

3
RAND(), UUID(), NOW()İndeterminist fonksiyonlardır. Bu tür işlevlerin çağrılması, çoğaltma için çöp kutusu günlüğüne yazılmamalıdır. Örneğin. alanların INSERT INTO t SET ID=UUID();değerinin IDmaster ve slave'lerde farklı olmasına neden olur . Bunun yerine, olarak yazılması SET @uuid:=UUID();ve ardından INSERT INTO t SET ID=@uuid;tek bir işlemde çalıştırılması gerekir. Bu, çoğaltma açısından güvenli olacaktır. Bu, bu soru için biraz konu dışı. Cevabınızın herhangi bir sorunu olduğunu söylemiyor. :)
Qian Chen

10

Olarak RANDbir dizi 0 <üretir = v <1.0 (bakınız belgeler ) kullanmak gerekir ROUNDüst (bu durumda 500) bağlanan ve alt (bu durumda 100) bağlanmış olsun sağlamak için

Yani ihtiyacınız olan aralığı üretmek için:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users

Böyle Bu kodlama çalışma - SEÇ YUVARLAK (100.0 + 400.0 * RAND ()) RANDOM_NUMBER OLARAK ama şimdi benim sorgu ile çalışma
TNK

random_number sütunu, sorgumla birlikte rastgele oluşturulmuş bir sütun olmalıdır.
TNK

1
Bu yöntem, ilk ve son sayıyı azaltacaktır.
Slobodan Pejic

4

Bu yanıta ek olarak, aşağıdaki gibi bir işlev oluşturun:

CREATE FUNCTION myrandom(
    pmin INTEGER,
    pmax INTEGER
)
RETURNS INTEGER(11)
DETERMINISTIC
NO SQL
SQL SECURITY DEFINER
BEGIN
  RETURN floor(pmin+RAND()*(pmax-pmin));
END; 

ve beğen

SELECT myrandom(100,300);

Bu size 100 ile 300 arasında rastgele sayı verir


3

FLOOR(RAND() * n) as randnum(N bir tamsayıdır) kullanarak rastgele bir sayı oluşturabilirsiniz , ancak aynı rasgele sayının tekrarlanmasına ihtiyacınız yoksa, geçici bir tabloda bir şekilde saklamanız gerekecektir. Böylece şununla kontrol edebilirsiniz where randnum not in (select * from temptable)...


3

ikisi de iyi çalışıyor:

select round(<maxNumber>*rand())

FLOOR(RAND() * (<max> - <min> + 1)) + <min> // generates a number
between <min> and <max> inclusive.

0

Bu gelen tamsayılar bulmak için doğru formüldür iiçin jneredei <= R <= j

FLOOR(min+RAND()*(max-min))

3
Bu yanlış, asla j (veya max) üretmeyecek. Bir i <= R <j sayısı üretir.
jlh

1
Olmalı:FLOOR(min+RAND()*(max-min+1))
David Rodrigues
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.