BAND RANDOM com sementes?

8

Eu tenho usado $((1 + RANDOM % 1000))para gerar um número aleatório.

É possível fazer algo semelhante, mas fornecer uma semente?

Para que, dada a mesma semente, o mesmo número aleatório seja sempre gerado?

Philip Kirkbride
fonte

Respostas:

14

Atribua um valor inicial para 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
$ 

Observe que aspas simples são usadas; aspas duplas executam regras de interpolação incorreta do 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
$ 

porque $RANDOMestá sendo interpolado pelo shell pai antes da bash -c ...execução do processo filho . Use aspas simples para desativar a interpolação (como mostrado acima) ou impedir a interpolação:

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

Esse recurso RANDOMé mencionado no bash(1)manual

   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.
agitar
fonte
Se eu correr random=$(bash -c "RANDOM=640; echo $RANDOM"), não deveria retornar o mesmo a cada vez? Ou é porque o $(bash ...não é tratado como uma nova instância do bash?
Philip Kirkbride
1
doublequotes provavelmente não é o que você quer lá
thrig
1
Veja o que acontece se você fizer isso: set -x; FOO=42; bash -c "FOO=999; echo $FOO". As aspas duplas estão permitindo que o shell externo seja substituído $RANDOMpelo aleatório do shell externo; o shell bash interno está simplesmente ecoando um número inteiro.
Jeff Schaller
@thrig eu preciso aspas porque no meu caso é realmenterandom=$(bash -c "RANDOM=$mac; echo $RANDOM")
Philip Kirkbride
Claro que deveria ser bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'.
G-Man diz 'Reinstate Monica'