Sto usando $((1 + RANDOM % 1000))
per generare un numero casuale.
È possibile fare qualcosa di simile ma fornire un seme?
In modo che dato lo stesso seme verrà sempre prodotto lo stesso numero casuale?
Sto usando $((1 + RANDOM % 1000))
per generare un numero casuale.
È possibile fare qualcosa di simile ma fornire un seme?
In modo che dato lo stesso seme verrà sempre prodotto lo stesso numero casuale?
Risposte:
Assegna un valore seed a 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
$
Si noti che vengono utilizzate virgolette singole; le virgolette doppie eseguono regole di interpolazione della shell afoul:
$ 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
$
perché $RANDOM
viene interpolato dalla shell padre prima bash -c ...
che venga eseguito il processo figlio . Utilizzare le virgolette singole per disattivare l'interpolazione (come mostrato sopra) o impedire in altro modo l'interpolazione:
$ 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
$
Questa funzione di RANDOM
è menzionata nel bash(1)
manuale
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.
set -x; FOO=42; bash -c "FOO=999; echo $FOO"
. Le doppie virgolette consentono alla shell esterna di sostituire $RANDOM
casualmente la shell esterna; la shell bash interna sta semplicemente facendo eco a un numero intero.
random=$(bash -c "RANDOM=$mac; echo $RANDOM")
bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'
.
random=$(bash -c "RANDOM=640; echo $RANDOM")
, non dovrebbe restituire lo stesso ogni volta? O è perché$(bash ...
non viene trattato come una nuova istanza di bash?