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


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

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

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


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)...


3

ambos funcionan bien:

select round(<maxNumber>*rand())

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

0

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.