私は$((1 + RANDOM % 1000))
乱数を生成するために使用しています。
同様のことをすることは可能ですが、シードを提供することはできますか?
同じシードを指定すると、同じ乱数が常に出力されるようにするには?
私は$((1 + RANDOM % 1000))
乱数を生成するために使用しています。
同様のことをすることは可能ですが、シードを提供することはできますか?
同じシードを指定すると、同じ乱数が常に出力されるようにするには?
回答:
にシード値を割り当てます 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.
set -x; FOO=42; bash -c "FOO=999; echo $FOO"
。二重引用符により、外部シェルを$RANDOM
外部シェルのランダムに置き換えることができます。内部のbashシェルは単に整数をエコーしています。
random=$(bash -c "RANDOM=$mac; echo $RANDOM")
bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'
。
random=$(bash -c "RANDOM=640; echo $RANDOM")
、毎回同じものを返すべきではないですか?それとも$(bash ...
、bashの新しいインスタンスとして扱われないためでしょうか?