creando un numero casuale utilizzando MYSQL


96

Vorrei sapere che esiste un modo per selezionare un numero generato in modo casuale compreso tra 100 e 500 insieme a una query di selezione.

Per esempio: SELECT name, address, random_number FROM users

Non devo memorizzare questo numero in db e usarlo solo per visualizzare lo scopo.

Ho provato qualcosa del genere, ma non riesco a funzionare ..

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

Spero che qualcuno mi aiuti. Grazie


Risposte:


146

Questo dovrebbe dare quello che vuoi:

FLOOR(RAND() * 401) + 100

Generalmente, FLOOR(RAND() * (<max> - <min> + 1)) + <min>genera un numero compreso tra <min> e <max>inclusivo.

Aggiornare

Questa dichiarazione completa dovrebbe funzionare:

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

come utilizzo questo codice. Ho provato in questo modo - FLOOR (RAND () * 401) + 100 come numero, ma non funziona
TNK

NOTA: non ho una colonna denominata "numero" nel mio database. Deve essere una colonna generata dinamicamente. è possibile?
TNK

1
@EdHeal In realtà penso round()che darà una distribuzione non uniforme.
Ja͢ck

1
È meglio memorizzare il risultato in una variabile e utilizzare la variabile se si dispone della replica master slave. SET @r=FLOOR(RAND() * 401) + 100, allora SELECT @r.
Qian Chen

3
RAND(), UUID(), NOW()Sono funzioni indeterministiche. È necessario evitare che la chiamata di tali funzioni venga scritta nel registro bin per la replica. Per esempio. INSERT INTO t SET ID=UUID();farà sì che il valore dei IDcampi sia diverso su master e slave. Invece deve essere scritto come SET @uuid:=UUID();, quindi INSERT INTO t SET ID=@uuid;, quindi eseguirli in una singola transazione. Ciò sarà sicuro per la replica. Questo è un po 'fuori tema per questa domanda. Non dice che la tua risposta ha qualche problema. :)
Qian Chen

10

Poiché RANDproduce un numero 0 <= v <1.0 (vedi documentazione ) che devi usare ROUNDper assicurarti di poter ottenere il limite superiore (500 in questo caso) e il limite inferiore (100 in questo caso)

Quindi per produrre la gamma di cui hai bisogno:

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

Questa codifica funziona in questo modo: SELEZIONA ROUND (100.0 + 400.0 * RAND ()) AS random_number, ma ora funziona con la mia query
TNK

La colonna random_number deve essere una colonna generata in modo casuale insieme alla mia query.
TNK

1
Questo metodo renderà meno probabile il primo e l'ultimo numero.
Slobodan Pejic

4

Oltre a questa risposta, crea una funzione come

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

e chiama like

SELECT myrandom(100,300);

Questo ti dà un numero casuale compreso tra 100 e 300


3

È possibile creare un numero casuale utilizzando FLOOR(RAND() * n) as randnum(n è un numero intero), tuttavia se non è necessario ripetere lo stesso numero casuale, sarà necessario archiviarlo in una tabella temporanea. Quindi puoi verificarlo con where randnum not in (select * from temptable)...


3

entrambi funzionano bene:

select round(<maxNumber>*rand())

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

0

Questa è la formula corretta per trovare numeri interi da ia jdovei <= R <= j

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

3
Questo è sbagliato, non produrrà mai j (o max). Produce un numero i <= R <j.
jlh

1
Dovrebbe essere:FLOOR(min+RAND()*(max-min+1))
David Rodrigues il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.