Bash RANDOM avec des graines?

8

J'utilise $((1 + RANDOM % 1000))pour générer un nombre aléatoire.

Est-il possible de faire quelque chose de similaire mais de fournir une graine?

Donc, étant donné la même graine, le même nombre aléatoire sera toujours affiché?

Philip Kirkbride
la source

Réponses:

14

Attribuez une valeur de départ à RANDOM

$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ 

Notez que des guillemets simples sont utilisés; les guillemets doubles exécutent les règles d'interpolation du shell:

$ bash -c 'RANDOM=42; echo $RANDOM $RANDOM $RANDOM'
19081 17033 15269
$ RANDOM=42
$ bash -c "RANDOM=640; echo $RANDOM"
19081
$ bash -c "RANDOM=640; echo $RANDOM"
17033
$ bash -c "RANDOM=640; echo $RANDOM"
15269
$ 

car $RANDOMest interpolé par le shell parent avant l' bash -c ...exécution du processus enfant . Utilisez des guillemets simples pour désactiver l'interpolation (comme indiqué ci-dessus) ou empêchez l'interpolation:

$ RANDOM=42
$ SEED_FOR_MY_GAME=640
$ bash -c "RANDOM=$SEED_FOR_MY_GAME; echo \$RANDOM"
28612
$ bash -c "RANDOM=$SEED_FOR_MY_GAME; echo \$RANDOM"
28612
$ 

Cette fonctionnalité RANDOMest mentionnée dans le bash(1)manuel

   RANDOM Each time this parameter is referenced, a random integer between
          0 and 32767 is generated.  The sequence of random numbers may be
          initialized by assigning a value to RANDOM.  If RANDOM is unset,
          it loses its special properties,  even  if  it  is  subsequently
          reset.
branler
la source
Si je cours, random=$(bash -c "RANDOM=640; echo $RANDOM")cela ne devrait-il pas revenir à chaque fois? Ou est-ce parce que le $(bash ...n'est pas traité comme une nouvelle instance de bash?
Philip Kirkbride
1
doublequotes n'est probablement pas ce que vous voulez là
thrig
1
Regardez ce qui se passe si vous le faites: set -x; FOO=42; bash -c "FOO=999; echo $FOO". Les guillemets doubles permettent à la coque extérieure de remplacer $RANDOMpar la coque externe aléatoire; le shell bash interne fait simplement écho à un entier.
Jeff Schaller
@thrig J'ai besoin de guillemets doubles car dans mon cas c'est en faitrandom=$(bash -c "RANDOM=$mac; echo $RANDOM")
Philip Kirkbride
Bien sûr que ça devrait l' être bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'.
G-Man dit `` Réintègre Monica ''