création d'un nombre aléatoire en utilisant MYSQL

96

Je voudrais savoir s'il existe un moyen de sélectionner un nombre généré au hasard entre 100 et 500 avec une requête de sélection.

Par exemple: SELECT name, address, random_number FROM users

Je n'ai pas besoin de stocker ce numéro dans la base de données et de l'utiliser uniquement à des fins d'affichage.

J'ai essayé quelque chose comme ça, mais il ne peut pas fonctionner.

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

J'espère que quelqu'un m'aidera. Je vous remercie

TNK
la source
1
Veuillez visiter ce lien stackoverflow.com/questions/1045138/…
DevelopmentIsMyPassion

Réponses:

146

Cela devrait donner ce que vous voulez:

FLOOR(RAND() * 401) + 100

De manière générique, FLOOR(RAND() * (<max> - <min> + 1)) + <min>génère un nombre entre <min> et <max>inclus.

Mettre à jour

Cette déclaration complète devrait fonctionner:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users
Jack
la source
comment j'utilise ce code. J'ai essayé comme ça - FLOOR (RAND () * 401) + 100 comme numéro, mais ne fonctionne pas
TNK
REMARQUE: je n'ai pas de colonne nommée «nombre» dans ma base de données. Il doit s'agir d'une colonne générée dynamiquement. est-ce possible?
TNK
1
@EdHeal En fait, je pense que round()cela donnera une distribution non uniforme.
Ja͢ck
1
Mieux vaut stocker le résultat dans une variable et utiliser la variable si vous disposez d'une réplication maître-esclave. SET @r=FLOOR(RAND() * 401) + 100, alors SELECT @r.
Qian Chen
3
RAND(), UUID(), NOW()Sont des fonctions indéterministes. L'appel de ces fonctions doit être évité d'être écrit dans le journal bin pour la réplication. Par exemple. INSERT INTO t SET ID=UUID();entraînera une valeur différente des IDchamps sur le maître et les esclaves. Au contraire , il doit être écrit SET @uuid:=UUID();, puis INSERT INTO t SET ID=@uuid;, puis les exécuter en une seule transaction. Ce sera sans danger pour la réplication. C'est un peu hors sujet pour cette question. Cela ne dit pas que votre réponse a un problème. :)
Qian Chen
10

Comme RANDproduit un nombre 0 <= v <1.0 (voir la documentation ) que vous devez utiliser ROUNDpour vous assurer que vous pouvez obtenir la limite supérieure (500 dans ce cas) et la limite inférieure (100 dans ce cas)

Donc pour produire la gamme dont vous avez besoin:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users
Ed Heal
la source
Ce codage fonctionne comme ça - SELECT ROUND (100,0 + 400,0 * RAND ()) AS random_number, mais fonctionne maintenant avec ma requête
TNK
La colonne random_number doit être une colonne générée aléatoirement avec ma requête.
TNK
1
Cette méthode rendra le premier et le dernier nombre moins probables.
Slobodan Pejic
4

En plus de cette réponse, créez une fonction comme

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

et appeler comme

SELECT myrandom(100,300);

Cela vous donne un nombre aléatoire entre 100 et 300

Kadir Erturk
la source
3

Vous pouvez créer un nombre aléatoire en utilisant FLOOR(RAND() * n) as randnum(n est un entier), mais si vous n'avez pas besoin de répéter le même nombre aléatoire, vous devrez un peu stocker dans une table temporaire. Vous pouvez donc le comparer avec where randnum not in (select * from temptable)...

bonCodigo
la source
3

ces deux fonctionnent bien:

select round(<maxNumber>*rand())

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

C'est la formule correcte pour trouver des entiers de ià ji <= R <= j

FLOOR(min+RAND()*(max-min))
ﻂﺎﻫﺭ ﻏﻔﺎﺮ
la source
3
C'est faux, cela ne produira jamais j (ou max). Il produit un nombre i <= R <j.
jlh
1
Devrait être:FLOOR(min+RAND()*(max-min+1))
David Rodrigues le