Bash ACAK dengan biji?


8

Saya telah menggunakan $((1 + RANDOM % 1000))untuk menghasilkan nomor acak.

Apakah mungkin melakukan sesuatu yang serupa tetapi menyediakan benih?

Jadi, jika diberi benih yang sama, nomor acak yang sama akan selalu dihasilkan?

Jawaban:


14

Tetapkan nilai seed untuk 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
$ 

Perhatikan bahwa kutipan tunggal digunakan; tanda kutip ganda menjalankan aturan interpolasi 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
$ 

karena $RANDOMsedang diinterpolasi oleh shell induk sebelum bash -c ...proses anak dijalankan. Gunakan tanda kutip tunggal untuk mematikan interpolasi (seperti yang ditunjukkan di atas) atau mencegah interpolasi:

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

Fitur RANDOMini disebutkan dalam 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.

Jika saya berlari random=$(bash -c "RANDOM=640; echo $RANDOM")bukankah seharusnya kembali sama setiap kali? Atau karena $(bash ...itu tidak diperlakukan sebagai contoh baru dari bash?
Philip Kirkbride

1
doublequotes mungkin bukan yang Anda inginkan di sana
thrig

1
Perhatikan apa yang terjadi jika Anda lakukan: set -x; FOO=42; bash -c "FOO=999; echo $FOO". Kutipan ganda memungkinkan kulit terluar untuk diganti $RANDOMdengan acak kulit terluar; shell bash bagian dalam hanya menggemakan bilangan bulat.
Jeff Schaller

@ thrig Saya perlu tanda kutip ganda karena dalam kasus saya sebenarnyarandom=$(bash -c "RANDOM=$mac; echo $RANDOM")
Philip Kirkbride

Tentu saja harus menjadi bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'.
G-Man Mengatakan 'Reinstate Monica'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.