Erstellen einer Zufallszahl mit MYSQL

95

Ich würde gerne wissen, ob es eine Möglichkeit gibt, zufällig generierte Zahlen zwischen 100 und 500 zusammen mit einer Auswahlabfrage auszuwählen.

Z.B: SELECT name, address, random_number FROM users

Ich muss diese Nummer nicht in db speichern und nur zur Anzeige des Zwecks verwenden.

Ich habe es so etwas versucht, aber es kann nicht funktionieren.

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

Hoffe mir hilft mir jemand. Danke dir

TNK
quelle
1
Bitte besuchen Sie diesen Link stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

Antworten:

145

Dies sollte geben, was Sie wollen:

FLOOR(RAND() * 401) + 100

FLOOR(RAND() * (<max> - <min> + 1)) + <min>Generiert generell eine Zahl zwischen <min> und <max>einschließlich.

Aktualisieren

Diese vollständige Erklärung sollte funktionieren:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users
Jack
quelle
wie ich diesen Code benutze. Ich habe es so versucht - FLOOR (RAND () * 401) + 100 als Nummer, aber es funktioniert nicht
TNK
HINWEIS: Ich habe keine Spalte mit dem Namen "Nummer" in meiner Datenbank. Diese Spalte muss dynamisch generiert werden. ist es möglich
TNK
1
@EdHeal Eigentlich denke ich, round()wird eine ungleichmäßige Verteilung geben.
Ja͢ck
1
Speichern Sie das Ergebnis besser in einer Variablen und verwenden Sie die Variable, wenn Sie über eine Master-Slave-Replikation verfügen. SET @r=FLOOR(RAND() * 401) + 100dann SELECT @r.
Qian Chen
3
RAND(), UUID(), NOW()Sind indeterministischen Funktionen. Der Aufruf solcher Funktionen sollte vermieden werden, dass er zur Replikation in das Bin-Protokoll geschrieben wird. Beispielsweise. INSERT INTO t SET ID=UUID();bewirkt, dass der Wert der IDFelder auf Master und Slaves unterschiedlich ist. Stattdessen muss es als geschrieben SET @uuid:=UUID();und dann INSERT INTO t SET ID=@uuid;in einer einzigen Transaktion ausgeführt werden. Dies ist replikationssicher. Dies ist ein wenig abseits des Themas für diese Frage. Es heißt nicht, dass Ihre Antwort ein Problem hat. :)
Qian Chen
10

Da RANDeine Zahl 0 <= v <1.0 (siehe Dokumentation ) erzeugt wird, müssen Sie ROUNDsicherstellen, dass Sie die Obergrenze (in diesem Fall 500) und die Untergrenze (in diesem Fall 100) erhalten.

Um das Sortiment zu produzieren, das Sie benötigen:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users
Ed Heal
quelle
Diese Codierung funktioniert so - SELECT ROUND (100.0 + 400.0 * RAND ()) AS random_number, aber jetzt funktioniert mit meiner Abfrage
TNK
Die Spalte random_number muss zusammen mit meiner Abfrage eine zufällig generierte Spalte sein.
TNK
1
Diese Methode verringert die Wahrscheinlichkeit der ersten und letzten Zahl.
Slobodan Pejic
4

Erstellen Sie zusätzlich zu dieser Antwort eine Funktion wie

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

und wie anrufen

SELECT myrandom(100,300);

Dies gibt Ihnen eine Zufallszahl zwischen 100 und 300

Kadir Erturk
quelle
3

Sie können eine Zufallszahl mit FLOOR(RAND() * n) as randnum(n ist eine Ganzzahl) erstellen. Wenn Sie jedoch nicht dieselbe Zufallszahl wiederholen müssen, müssen Sie sie in einer temporären Tabelle speichern. Sie können es also mit where randnum not in (select * from temptable)...

bonCodigo
quelle
3

beide funktionieren gut:

select round(<maxNumber>*rand())

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

Dies ist richtige Formel ganze Zahlen zu finden , von izu jdeneni <= R <= j

FLOOR(min+RAND()*(max-min))
ﻂﺎﻫﺭ ﻏﻔﺎﺮ
quelle
3
Dies ist falsch, es wird niemals j (oder max) erzeugt. Es erzeugt eine Zahl i <= R <j.
jlh
1
Sollte sein:FLOOR(min+RAND()*(max-min+1))
David Rodrigues