tworzenie losowej liczby za pomocą MYSQL


96

Chciałbym wiedzieć, czy istnieje sposób na wybranie losowo wygenerowanej liczby od 100 do 500 wraz z zapytaniem wybierającym.

Na przykład: SELECT name, address, random_number FROM users

Nie muszę przechowywać tego numeru w db i używać go tylko do wyświetlania.

Próbowałem czegoś takiego, ale to nie działa.

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

Mam nadzieję, że ktoś mi pomoże. Dziękuję Ci


Odpowiedzi:


146

To powinno dać to, czego chcesz:

FLOOR(RAND() * 401) + 100

Generalnie FLOOR(RAND() * (<max> - <min> + 1)) + <min>generuje liczbę od <min> do<max> włącznie.

Aktualizacja

To pełne stwierdzenie powinno działać:

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

jak używam tego kodu. Próbowałem w ten sposób - FLOOR (RAND () * 401) + 100 jako numer, ale nie działa
TNK

UWAGA: Nie mam kolumny o nazwie „numer” w mojej bazie danych. Musi to być kolumna generowana dynamicznie. czy to możliwe?
TNK,

1
@EdHeal Właściwie myślę, że round()da niejednorodną dystrybucję.
Ja͢ck,

1
Lepiej zapisz wynik w zmiennej i użyj tej zmiennej, jeśli masz replikację typu master-slave. SET @r=FLOOR(RAND() * 401) + 100, więc SELECT @r.
Qian Chen

3
RAND(), UUID(), NOW()Są funkcjami indeterministyczną. Należy unikać zapisywania wywołań takich funkcji w dzienniku bin w celu replikacji. Na przykład. INSERT INTO t SET ID=UUID();spowoduje, że wartości IDpól będą różne na urządzeniach nadrzędnych i podrzędnych. Zamiast tego należy go zapisać jako SET @uuid:=UUID();, a INSERT INTO t SET ID=@uuid;następnie uruchomić je w jednej transakcji. To będzie bezpieczne dla replikacji. To jest trochę nie na temat tego pytania. Nie oznacza to, że twoja odpowiedź ma jakiś problem. :)
Qian Chen

10

Ponieważ RANDdaje liczbę 0 <= v <1,0 (patrz dokumentacja ), której należy użyć, ROUNDaby upewnić się, że można uzyskać górną granicę (w tym przypadku 500) i dolną granicę (w tym przypadku 100)

Aby wyprodukować asortyment, którego potrzebujesz:

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

To kodowanie działa w ten sposób - SELECT ROUND (100.0 + 400.0 * RAND ()) AS random_number, ale teraz działa z moim zapytaniem
TNK

Kolumna random_number musi być kolumną generowaną losowo wraz z moim zapytaniem.
TNK,

1
Ta metoda zmniejszy prawdopodobieństwo wystąpienia pierwszej i ostatniej liczby.
Slobodan Pejic

4

Oprócz tej odpowiedzi utwórz funkcję taką jak

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

i zadzwoń jak

SELECT myrandom(100,300);

Daje to losową liczbę od 100 do 300


3

Możesz utworzyć liczbę losową za pomocą FLOOR(RAND() * n) as randnum(n jest liczbą całkowitą), jednak jeśli nie potrzebujesz powtarzać tej samej liczby losowej, będziesz musiał trochę przechowywać w tabeli tymczasowej. Więc możesz to sprawdzić za pomocą where randnum not in (select * from temptable)...


3

te oba działają ładnie:

select round(<maxNumber>*rand())

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

0

Ta formuła jest poprawna znaleźć liczby całkowite od icelu j, gdziei <= R <= j

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

3
To jest złe, nigdy nie wyprodukuje j (lub max). Daje liczbę i <= R <j.
jlh

1
Powinno być:FLOOR(min+RAND()*(max-min+1))
David Rodrigues
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.