Bash RANDOM mit Samen?

8

Ich habe verwendet $((1 + RANDOM % 1000)), um eine Zufallszahl zu generieren.

Ist es möglich, etwas Ähnliches zu tun, aber einen Samen bereitzustellen?

Damit bei gleichem Startwert immer dieselbe Zufallszahl ausgegeben wird?

Philip Kirkbride
quelle

Antworten:

14

Weisen Sie einen Startwert zu 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
$ 

Beachten Sie, dass einfache Anführungszeichen verwendet werden. doppelte Anführungszeichen verstoßen gegen die Shell-Interpolationsregeln:

$ 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
$ 

weil $RANDOMvon der übergeordneten Shell interpoliert wird, bevor der untergeordnete bash -c ...Prozess ausgeführt wird. Verwenden Sie entweder einfache Anführungszeichen, um die Interpolation zu deaktivieren (wie oben gezeigt), oder verhindern Sie auf andere Weise die 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
$ 

Diese Funktion von RANDOMwird im bash(1)Handbuch erwähnt

   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.
Thrig
quelle
Wenn ich renne, random=$(bash -c "RANDOM=640; echo $RANDOM")sollte es nicht jedes Mal das gleiche zurückgeben? Oder liegt es daran, dass das $(bash ...nicht als neue Instanz von Bash behandelt wird?
Philip Kirkbride
1
Doppelzitate ist wahrscheinlich nicht das, was Sie dort wollen
Thrig
1
Beobachten Sie, was passiert, wenn Sie : set -x; FOO=42; bash -c "FOO=999; echo $FOO". Durch die doppelten Anführungszeichen kann die äußere Hülle durch $RANDOMdie Zufallszahl der äußeren Hülle ersetzt werden. Die innere Bash-Shell gibt einfach eine Ganzzahl wieder.
Jeff Schaller
@ Thrig Ich brauche doppelte Anführungszeichen, weil es in meinem Fall tatsächlich istrandom=$(bash -c "RANDOM=$mac; echo $RANDOM")
Philip Kirkbride
Natürlich sollte es so sein bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'.
G-Man sagt "Reinstate Monica"