Comment générer des nombres aléatoires dans Ruby

Bien qu'aucun ordinateur ne puisse générer de nombres vraiment aléatoires, Ruby donne accès à une méthode qui retournera pseudo-aléatoire Nombres.

Aucun ordinateur ne peut vraiment générer nombres aléatoires purement par calcul. Le mieux qu'ils peuvent faire est de générer pseudo-aléatoire nombres, qui sont une séquence de nombres qui apparaître aléatoire mais ne le sont pas.

Pour un observateur humain, ces nombres sont en effet aléatoires. Il n'y aura pas de courtes séquences répétitives et, au moins pour l'observateur humain, elles ne présenteront aucun modèle clair. Cependant, avec suffisamment de temps et de motivation, l'original la graine peut être découvert, la séquence recréée et le numéro suivant de la séquence deviné.

Pour cette raison, les méthodes décrites dans cet article ne devraient probablement pas être utilisées pour générer des numéros qui doivent être cryptographiquement sécurisés.

Les générateurs de nombres pseudo-aléatoires doivent être ensemencé afin de produire des séquences qui diffèrent à chaque fois qu'un nouveau nombre aléatoire est généré. Aucune méthode n'est magique - ces nombres apparemment aléatoires sont générés à l'aide d'algorithmes relativement simples et d'une arithmétique relativement simple. En semant le PRNG, vous le démarrez à un point différent à chaque fois. Si vous ne le semiez pas, il générerait à chaque fois la même séquence de nombres.

instagram viewer

En Ruby, le Noyau # srand La méthode peut être appelée sans argument. Il choisira une graine de nombre aléatoire en fonction de l'heure, de l'ID de processus et d'un numéro de séquence. Simplement en appelant srand n'importe où au début de votre programme, il générera une série différente de nombres apparemment aléatoires chaque fois que vous l'exécuterez. Cette méthode est appelée implicitement au démarrage du programme et amorce le PRNG avec l'heure et l'ID de processus (pas de numéro de séquence).

Une fois le programme lancé et Noyau # srand a été soit implicitement ou explicitement appelé, le Noyau # rand peut être appelée. Cette méthode, appelée sans argument, renverra un nombre aléatoire de 0 à 1. Dans le passé, ce nombre était généralement ajusté au nombre maximum que vous souhaitez générer et peut-être to_i appelé pour le convertir en un entier.

Cependant, Ruby rend les choses un peu plus faciles si vous utilisez Ruby 1.9.x. le Noyau # rand La méthode peut prendre un seul argument. Si cet argument est un Numérique de toute nature, Ruby générera un entier de 0 à (et non compris) ce nombre.

Cependant, que se passe-t-il si vous souhaitez générer un nombre compris entre 10 et 15? En règle générale, vous générez un nombre compris entre 0 et 5 et l'ajoutez à 10. Cependant, Ruby facilite les choses.

Assurez-vous de faire attention aux deux types de plages. Si vous avez appelé rand (10..15), cela générerait un nombre de 10 à 15 comprenant 15. Tandis que rand (10... 15) (avec 3 points) générerait un nombre de 10 à 15 non compris 15.

Parfois, vous avez besoin d'une séquence aléatoire de nombres, mais vous devez générer la même séquence à chaque fois. Par exemple, si vous générez des nombres aléatoires dans un test unitaire, vous devez générer la même séquence de nombres à chaque fois.

Un test unitaire qui échoue sur une séquence doit échouer à nouveau la prochaine fois qu'il est exécuté, s'il a généré une séquence de différence la prochaine fois, il peut ne pas échouer. Pour ce faire, appelez Noyau # srand avec une valeur connue et constante.

L'implémentation de Noyau # rand est plutôt non rubis. Il n'abstrait en aucun cas le PRNG, ni ne vous permet d'instancier le PRNG. Il existe un état global pour le PRNG que tous les codes partagent. Si vous modifiez la graine ou changez l'état du PRNG, cela peut avoir une plage d'effet plus large que vous ne l'aviez prévu.

Cependant, puisque les programmes s'attendent à ce que le résultat de cette méthode soit aléatoire - c'est son but! - ce ne sera probablement jamais un problème. Seulement si le programme s'attend à voir une séquence attendue de nombres, comme s'il avait appelé srand avec une valeur constante, en cas de résultats inattendus.