Mysql
 sql >> Base de données >  >> RDS >> Mysql

Répartition de RAND() dans MySQL

Je n'ai pas pu trouver rapidement le code source de la fonction ; le voir pourrait aider à obtenir une meilleure réponse. Cela dit, cela ressemble à un "non... mais un peu proche".

D'après la documentation, je peux voir qu'il essaie d'être aléatoire (et éventuellement vous pouvez le semer); mais il y a deux mises en garde qui signifient qu'il peut ne pas toujours être uniforme lorsque vous vous attendez à ce que le premier numéro se trouve dans sa documentation :

RAND() is not meant to be a perfect random generator. It is a fast way to generate random numbers on demand that is portable between platforms for the same MySQL version. 

c'est-à-dire que le code correspondant est discutable en tant que véritable générateur de nombres aléatoires - il est assez bon pour la plupart des usages, mais on ne peut pas lui faire confiance pour une utilisation, par exemple, dans le cryptage, et je parierais qu'on ne peut même pas lui faire confiance uniforme comme vous pouvez vous y attendre.

Leur affirmation selon laquelle ce n'est pas parfait signifie qu'il échouera presque certainement au moins à certains de ces tests; le comment n'est toujours pas clair, mais si ce n'est pas un RNG parfait, vous ne verrez pas une distribution parfaitement uniforme; Je m'attendrais à des écarts ou à des pics de plages plus/moins courants.http://www.stat.fsu.edu/pub/diehard/cdrom/pscript/monkey.ps (il y a eu d'autres travaux depuis, mais cela reste une partie du travail clé dans la validation des RNG).

Il parierait que le code derrière ne le fait certainement pas essayez de garantir une distribution uniforme, car cela (suivre l'historique de ce qui s'est déjà produit) gaspillerait des masses de mémoire. Dans tous les cas, si vous avez déjà généré beaucoup de valeurs à l'aide d'un RNG parfait, rien ne garantit que si vos valeurs jusqu'à présent étaient toutes basses, la prochaine sera élevée. Ce sera toujours aussi aléatoire..