RANDOMをシードでバッシュしますか?


8

私は$((1 + RANDOM % 1000))乱数を生成するために使用しています。

同様のことをすることは可能ですが、シードを提供することはできますか?

同じシードを指定すると、同じ乱数が常に出力されるようにするには?

回答:


14

にシード値を割り当てます 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
$ 

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

私が走った場合random=$(bash -c "RANDOM=640; echo $RANDOM")、毎回同じものを返すべきではないですか?それとも$(bash ...、bashの新しいインスタンスとして扱われないためでしょうか?
Philip Kirkbride 2017年


1
実行するとどうなるか見てくださいset -x; FOO=42; bash -c "FOO=999; echo $FOO"。二重引用符により、外部シェルを$RANDOM外部シェルのランダムに置き換えることができます。内部のbashシェルは単に整数をエコーし​​ています。
Jeff Schaller

@thrig私の場合は二重引用符が必要なので、二重引用符が必要ですrandom=$(bash -c "RANDOM=$mac; echo $RANDOM")
Philip Kirkbride

もちろんそれがなければならないことbash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'
G-Manは 'Reinstate Monica'を
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.