Bash ALEATÓRIO com semente?

7

Estou usando $((1 + RANDOM % 1000)) para gerar um número aleatório.

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

Então, dada a mesma semente, o mesmo número aleatório será sempre produzido?

    
por Philip Kirkbride 17.11.2017 / 18:37

1 resposta

13

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

Observe que as aspas simples são usadas; aspas duplas executam regras de interpolação diferentes:

$ 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 $RANDOM está sendo interpolado pelo shell pai antes que o processo child bash -c ... seja executado. Use aspas simples para desativar a interpolação (conforme mostrado acima) ou evitar 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
$ 

Este recurso de RANDOM é mencionado no manual bash(1)

   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.
    
por 17.11.2017 / 18:38

Tags