creando un número aleatorio usando MYSQL

95

Me gustaría saber si hay alguna manera de seleccionar un número generado aleatoriamente entre 100 y 500 junto con una consulta de selección.

P.ej: SELECT name, address, random_number FROM users

No tengo que almacenar este número en db y solo usarlo para mostrar el propósito.

Probé algo como esto, pero no funciona.

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

Espero que alguien me ayude. Gracias

TNK
fuente
1
Visite este enlace stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

Respuestas:

145

Esto debería dar lo que quieres:

FLOOR(RAND() * 401) + 100

Genéricamente, FLOOR(RAND() * (<max> - <min> + 1)) + <min>genera un número entre <min> e <max>inclusivo.

Actualizar

Esta declaración completa debería funcionar:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users
Jack
fuente
cómo uso este código. Intenté así: FLOOR (RAND () * 401) + 100 como número, pero no funciona
TNK
NOTA: No tengo una columna llamada 'número' en mi base de datos. Esta debe ser una columna generada dinámicamente. es posible
TNK
1
@EdHeal En realidad, creo round()que dará una distribución no uniforme.
Ja͢ck
1
Es mejor almacenar el resultado en una variable y usar la variable si tiene replicación maestro-esclavo. SET @r=FLOOR(RAND() * 401) + 100entonces SELECT @r.
Qian Chen
3
RAND(), UUID(), NOW()Son funciones indeterministas. Se debe evitar que la llamada a estas funciones se escriba en el registro de bin para su replicación. Por ejemplo. INSERT INTO t SET ID=UUID();hará que el valor de los IDcampos sea diferente en maestro y esclavos. En su lugar, debe escribirse como SET @uuid:=UUID();, y INSERT INTO t SET ID=@uuid;luego ejecutarlos en una sola transacción. Esto será seguro para la replicación. Esto es un poco fuera de tema para esta pregunta. No dice que tu respuesta tenga algún problema. :)
Qian Chen
10

Como RANDproduce un número 0 <= v <1.0 (consulte la documentación ) que debe usar ROUNDpara asegurarse de poder obtener el límite superior (500 en este caso) y el límite inferior (100 en este caso)

Entonces, para producir la gama que necesita:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users
Ed Heal
fuente
Esta codificación funciona así: SELECT ROUND (100.0 + 400.0 * RAND ()) AS random_number, pero ahora funciona con mi consulta
TNK
La columna de número aleatorio debe ser una columna generada aleatoriamente junto con mi consulta.
TNK
1
Este método hará que el primer y el último número sean menos probables.
Slobodan Pejic
4

Además de esta respuesta, cree una función como

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

y llama como

SELECT myrandom(100,300);

Esto le da un número aleatorio entre 100 y 300

Kadir Erturk
fuente
3

Puede crear un número aleatorio usando FLOOR(RAND() * n) as randnum(n es un número entero), sin embargo, si no necesita que se repita el mismo número aleatorio, tendrá que almacenarlo en una tabla temporal. Entonces puedes compararlo con where randnum not in (select * from temptable)...

bonCodigo
fuente
3

ambos funcionan bien:

select round(<maxNumber>*rand())

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

Esta es la fórmula correcta para encontrar números enteros de ia jdondei <= R <= j

FLOOR(min+RAND()*(max-min))
ﻂﺎﻫﺭ ﻏﻔﺎﺮ
fuente
3
Esto está mal, nunca producirá j (o max). Produce un número i <= R <j.
Jlh
1
Debería ser:FLOOR(min+RAND()*(max-min+1))
David Rodrigues