9.6. $RANDOM : générer un nombre aléatoire

$RANDOM est une fonction interne Bash (pas une constante) qui renvoie un entier pseudo-aléatoire [43] dans l'intervalle 0 - 32767. Il ne devrait pas être utilisé pour générer une clé de chiffrement.

Exemple 9.26. Générer des nombres aléatoires

&ex21;

Exemple 9.27. Piocher une carte au hasard dans un tas

&pickcard;

Exemple 9.28. Simulation « Brownian Motion »

&brownian;

Jipe nous a indiqué un autre ensemble de techniques pour générer des nombres aléatoires à l'intérieur d'un intervalle donné.

#  Génére des nombres aléatoires entre 6 et 30.
rnumber=$((RANDOM%25+6))

#  Générer des nombres aléatoires dans le même intervalle de 6 à 30,
#+ mais le nombre doit être divisible de façon exacte par 3.
rnumber=$(((RANDOM%30/3+1)*3))

# Notez que ceci ne fonctionnera pas tout le temps.
# Il échoue si $RANDOM%30 renvoie 0.

#  Frank Wang suggère l'alternative suivante :
   rnumber=$(( RANDOM%27/3*3+6 ))

Bill Gradwohl est parvenu à une formule améliorée fonctionnant avec les numéros positifs.

rnumber=$(((RANDOM%(max-min+divisiblePar))/divisiblePar*divisiblePar+min))

Ici, Bill présente une fonction versatile renvoyant un numéro au hasard entre deux valeurs spécifiques.

Exemple 9.29. Un nombre au hasard entre deux valeurs

&randombetween;

À quel point $RANDOM est-il aléatoire ? la meilleure façon de le tester est d'écrire un script qui enregistre la suite des nombres « aléatoires » générés par $RANDOM. Faisons tourner $RANDOM plusieurs fois...

Exemple 9.30. Lancement d'un seul dé avec RANDOM

&randomtest;

Comme nous avons vu sur le dernier exemple, il est préférable de réinitialiser le générateur RANDOM à chaque fois qu'il est invoqué. Utiliser le même germe pour RANDOM ne fera que répéter la même série de nombres [44] (ceci reflète le comportement de la fonction C random()).

Exemple 9.31. Réinitialiser RANDOM

&seedingrandom;

[Note]

Note

Le pseudo fichier périphérique /dev/urandom apporte une méthode pour générer des nombres pseudo-aléatoires bien plus « aléatoires » que la variable $RANDOM. dd if=/dev/urandom of=fichier_cible bs=1 count=XX crée un fichier de nombres pseudo-aléatoires bien distribués. Néanmoins, assigner ces nombres à une variable dans un script nécessite un petit travail supplémentaire, tel qu'un filtrage par l'intermédiaire de od (comme dans l'exemple ci-dessus, dans l'Exemple 15.14, « Générer des nombres aléatoires de dix chiffres » et dans Exemple A.36, « Tri d'insertion ») ou même d'envoyer via un tube dans md5sum (voir l'Exemple 33.14, « Un jeu de « courses de chevaux » »).

Il existe encore d'autres moyens pour générer des nombres pseudo aléatoires dans un script. Awk propose une façon agréable de le faire.

Exemple 9.32. Nombres pseudo-aléatoires, en utilisant awk

&random2;

La commande date tend elle-même à générer des séquences d'entiers pseudo-aléatoires.



[43] Un vrai « hasard », si tant est qu'il puisse exister, peut seulement être trouvé dans certains phénomènes naturels compris partiellement tels que la destruction radioactive. Les ordinateurs simulent le hasard et les séquences générées par ordinateur de nombres « aléatoires » sont du coup appelés pseudo-aléatoires.

[44] La graine d'une série de nombres pseudo-aléatoires générés par un ordinateur peut être considérée comme une étiquette d'identification. Par exemple, vous pouvez désigner les séries pseudo-aléatoires de graine 23 comme les séries #23.

Une propriété d'une série de nombres pseudo-aléatoires est la longueur du cycle avant qu'il ne commence à se répéter. Un bon générateur pseudo-aléatoire produira des séries avec de très longs cycles.