Bash RANDOM con semillas?

8

He estado usando $((1 + RANDOM % 1000))para generar un número aleatorio.

¿Es posible hacer algo similar pero proporcionar una semilla?

Entonces, ¿dada la misma semilla, siempre se generará el mismo número aleatorio?

Philip Kirkbride
fuente

Respuestas:

14

Asignar un valor semilla 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
$ 

Tenga en cuenta que se utilizan comillas simples; las comillas dobles corren reglas de interpolación de 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á siendo interpolado por el shell principal antes de bash -c ...que se ejecute el proceso secundario . Utilice comillas simples para desactivar la interpolación (como se muestra arriba) o evite la interpolación:

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

Esta característica de RANDOMse menciona en el 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.
thrig
fuente
Si corro, random=$(bash -c "RANDOM=640; echo $RANDOM")¿no debería volver lo mismo cada vez? ¿O es porque $(bash ...no se trata como una nueva instancia de bash?
Philip Kirkbride
1
doublequotes probablemente no sea lo que quieres allí
thrig
1
Mira lo que sucede si lo hace: set -x; FOO=42; bash -c "FOO=999; echo $FOO". Las comillas dobles permiten que el caparazón externo se reemplace $RANDOMcon el caparazón externo al azar; el shell bash interno simplemente hace eco de un número entero.
Jeff Schaller
@thrig Necesito comillas dobles porque en mi caso es realmenterandom=$(bash -c "RANDOM=$mac; echo $RANDOM")
Philip Kirkbride
Por supuesto que debería ser bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'.
G-Man dice 'reinstalar a Monica' el