Comment générer de nombres aléatoires en Bash?
Comment générer un nombre aléatoire dans une plage de Bash?
- Comment aléatoire t-il besoin d'être?
Vous devez vous connecter pour publier un commentaire.
Comment générer un nombre aléatoire dans une plage de Bash?
Vous devez vous connecter pour publier un commentaire.
Utilisation
$RANDOM
. Il est souvent utile en combinaison avec la coquille simple arithmétique. Par exemple, pour générer un nombre aléatoire entre 1 et 10:Le réel générateur est en
variables.c
, la fonctionbrand()
. Les anciennes versions s'agissait d'un simple générateur linéaire. La Version 4.0 debash
utilise un générateur avec une citation à un papier 1985, ce qui signifie probablement que c'est un décent source de nombres pseudo-aléatoires. Je ne voudrais pas l'utiliser pour une simulation (et certainement pas pour les crypto), mais c'est probablement suffisant pour la base de tâches de script.Si vous êtes en train de faire quelque chose qui requiert un sérieux nombres aléatoires, vous pouvez utiliser
/dev/random
ou/dev/urandom
si elles sont disponibles:$RANDOM % 10
, 8 et 9 sont sensiblement (mais légèrement) moins probable que 0-7, même si$RANDOM
est une source fiable de données aléatoires.$RANDOM
'de la gamme s est0-32767
les numéros de0
-7
carte de3277
différentes entrées possibles, mais8
et9
ne peut être produite3276
différentes façons (parce que32768
et32769
ne sont pas possibles). C'est un problème mineur pour rapide hacks, mais le résultat n'est pas uniformément aléatoire. Les bibliothèques aléatoires, comme JavaRandom
, offre des fonctions de restitution d'un nombre aléatoire uniforme dans l'intervalle donné, plutôt que de simplement mod-ing non-divisible nombre.% n
peut-être même pire. Regardez la dernière photo de Test de GÉNÉRATEUR à l'aide de gris bitmap. Il montre à l'évidence l'inclinaisonecho $((1 + $RANDOM % 10))
avec le$RANDOM
, pas seulementRANDOM
.Veuillez voir
$RANDOM
:32767
a une signification particulière?2^16 / 2 - 1
qui est la limite supérieure pour un signé de 16 bits entier.2^15 - 1
? C'est l'équivalent, donc je suis juste curieux de savoir si le contexte est que je suis absent?Essayer ce à partir de votre shell:
Ici,
-t d
indique que le format de sortie doit être signée décimale;-N 1
dit de lire un octet de/dev/urandom
.od -A n -t d -N 1 /dev/urandom |tr -d ' '
Vous pouvez également utiliser shuf (disponible en coreutils).
shuf -i 1-10 -n 1: syntax error in expression (error token is "1-10 -n 1")
$var
au lieu de la fin de la plage, comme ceci:var=100 && shuf -i 1-${var} -n 1
vous pouvez également obtenir de nombre aléatoire à partir de awk
srand()
's semence, c'est le courant de temps PROCESSEUR. Si vous avez besoin de spécifier un les semences, la RNG peut être dupliqué, utilisezsrand(x)
oùx
est la semence. Aussi, cité de GNU awk fonction numérique manuel, "les différents awk implémentations utilisent différents aléatoire nombre de générateurs en interne." Le résultat est que, si vous êtes intéressé à générer des statistiques de la distribution, vous devriez vous attendre à de légères variations allant d'une exécution à l'autre sur la plate-forme différente (tous en cours d'exécutionawk
ougawk
).Il y a $ALÉATOIRE.
Je ne sais pas exactement comment il fonctionne. Mais il fonctionne.
Pour les tests, vous pouvez le faire :
Nombre aléatoire entre 0 et 9 inclus.
$RANDOM
ne va de 0 à 32767. Il aurait du dire "nombre Aléatoire pour la plupart entre 1 et 3, avec un peu d'ailiers" 😉J'aime cette astuce:
...
${RANDOM:0:1}
a 67.8% de chances de vous donner un 1 ou un 2,${RANDOM:0:2}
a seulement 0,03% de chance de vous donner un seul chiffre (1%), et les deux ont un 0.003% de chance de vous donner une 0. Il y a encore des cas d'utilisation où c'est très bien (par exemple la non-conforme d'entrée).Si vous utilisez un système linux, vous pouvez obtenir un nombre aléatoire de /dev/random ou /dev/urandom. Attention de /dev/random qui se bloque si il n'y a pas assez de nombres aléatoires disponibles. Si vous avez besoin de vitesse sur l'aléatoire l'utilisation de /dev/urandom.
Ces "fichiers" sera remplie avec des nombres aléatoires générés par le système d'exploitation. Il dépend de la mise en place de /dev/random sur votre système si vous bénéficiez d'une véritable ou pseudo-aléatoire de nombres. De vrais nombres aléatoires sont générés à l'aide du formulaire de bruit recueillies auprès de pilotes de périphériques comme les souris, disque dur, réseau.
Vous pouvez obtenir des nombres aléatoires à partir du fichier avec dd
J'ai pris un peu de ces idées et de fait une fonction qui doit effectuer rapidement si beaucoup de nombres aléatoires sont nécessaires.
appel
od
est cher si vous avez besoin de beaucoup de nombres aléatoires. Au lieu de cela j'appelle ça une fois et stocker 1024 nombres aléatoires à partir de /dev/urandom. Lorsquerand
est appelé, le dernier nombre aléatoire est retourné et mis à l'échelle. Il est alors retiré de la mémoire cache. Lorsque le cache est vide, l'autre 1024 de nombres aléatoires est lu.Exemple:
Retourne un nombre aléatoire dans RET entre 0 et 9 inclus.
Mise à JOUR: cela ne fonctionne pas si bien pour tout N. Il a également des déchets de bits aléatoires avec des petits N. en Notant que (dans ce cas) de 32 bits nombre aléatoire a assez d'entropie pour les 9 nombres aléatoires entre 0 et 9 (10*9=1 000 000 000 d' <= 2*32), nous pouvons extraire plusieurs nombres aléatoires à partir de chacune des 32 aléatoire de la source de la valeur.
od -An -tu4 -N40 /dev/urandom
va générer 10 aléatoires non signé de 32 bits des nombres entiers séparés par des espaces. vous pouvez les stocker dans un tableau et utiliser par la suite. votre code semble être inutile.De lecture à partir de /dev/random et /dev/urandom caractère spécial des fichiers est le chemin à parcourir.
Ces deux fichiers sont interface noyau de la randomisation, en particulier
qui attire vraiment octets aléatoires du matériel si cette fonction est par le matériel mis en œuvre (généralement de l'est), ou il puise à la source d'entropie (composé de synchronisations entre les événements, comme les souris et les interruptions de clavier et d'autres interruptions qui sont enregistrés avec SA_SAMPLE_RANDOM).
Cela fonctionne, mais les écritures inutiles sortie de
dd
à stdout. La commande ci-dessous donne juste l'entier dont j'ai besoin. Je peux même obtenir un nombre spécifié de bits aléatoires, comme j'ai besoin de l'ajustement du masque de bits donné à l'expansion arithmétique:Ce sujet:
Je suis peut-être un peu trop tard, mais que penser de l'utilisation
jot
pour générer un nombre aléatoire dans une plage de Bash?Cela génère un nombre aléatoire (
-r
) nombre de 3 décimales de précision (-p
). Dans ce cas particulier, vous obtiendrez un nombre entre 0 et 1 (1 0 1
). Vous pouvez également imprimer des données séquentielles. La source de nombre aléatoire, selon le manuel, est:Générer des nombre aléatoire dans l'intervalle de 0 à n (entier signé de 16 bits). Résultat dans $RAND variable. Par exemple: