Quiconque essaie de produire des nombres aléatoires par des moyens déterministes est bien évidemment en état de péché.
--John von Neumann
$RANDOM est une fonction interne de Bash (pas une constante) qui renvoie un entier pseudo-aléatoire [44] dans l'intervalle 0 - 32767. Il ne faut pas l'utiliser pour générer une clé de chiffrement.
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.
À 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...
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 [45] (ceci reflète le comportement de la fonction C random()).
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 16.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 36.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.
La commande date tend elle-même à générer des séquences d'entiers pseudo-aléatoires.
[44] Le véritable « hasard », si tant est qu'il puisse exister, peut seulement être trouvé dans certains phénomènes naturels qu'on ne comprend qu'en partie, tels que la destruction radioactive. Les ordinateurs ne font que simuler le hasard, et les séquences générées par ordinateur de nombres « aléatoires » sont de ce fait appelées pseudo-aléatoires.
[45] 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.