
私は常に$((1 + RANDOM % 1000))
乱数を生成するために使用します。
同様のことをしながら種子を提供することは可能ですか?
では、同じシードが与えられると、常に同じ乱数が出力されますか?
答え1
シード値の割り当て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
$
一重引用符を使用すると、シェル補間規則に違反します。
$ 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
$
$RANDOM
親シェルは、子プロセスが実行される前に補間を実行するためです。bash -c ...
上記のように補間をオフにしたり、補間を防ぐには、単一引用符を使用します。
$ 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
$
RANDOM
この機能はマニュアルに記載されています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.
答え2
パーティーに遅れたが、「では、同じシードが与えられれば、常に同じ乱数が出力されるということですか?」という言葉を言わなければならないのですが、これは理解できませんね。
それがあなたが望むものなら、乱数は必要ありません。シーディングをスキップし、必要な「同じ乱数」を使用できます。一重引用符と二重引用符については、おそらくモックです。
いくつかのコメントは冷笑的だったと言いたいと思います。迷うのに時間がかかりすぎました。
RANDOM=$(date +%s);echo $RANDOM; echo $RANDOM; echo $(($RANDOM%1000))
私はこれがランダム性と同じくらい良いと思います。しかし、420があまりにも多く表示されます。