Bash RANDOM con semi?


8

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:


14

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é $RANDOMviene 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.

Se corro 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?
Philip Kirkbride,

1
il doublequotes probabilmente non è quello che vuoi lì
17-17

1
Guardate cosa succede se si fa: set -x; FOO=42; bash -c "FOO=999; echo $FOO". Le doppie virgolette consentono alla shell esterna di sostituire $RANDOMcasualmente la shell esterna; la shell bash interna sta semplicemente facendo eco a un numero intero.
Jeff Schaller

@thrig Ho bisogno di virgolette doppie perché nel mio caso in realtà lo èrandom=$(bash -c "RANDOM=$mac; echo $RANDOM")
Philip Kirkbride,

Certo che dovrebbe essere bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'.
G-Man dice "Ripristina Monica" il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.