for ループで perl スクリプトを反復処理し、スクリプトで使用srand(time¦$$)
して乱数をシードしています。
私の出力では、for ループを使用する代わりに一度に 1 つずつ実行すると、個々の結果を取得したときに結果が繰り返されます。これはsrand
ラインのせい?助言がありますか?
ありがとう!
同じ番号で を呼び出すと、次の呼び出しsrand
で返される一連の番号が同じになりrand
ます。したがって、srand(time() | $$)
立て続けに (たとえば、まったく同じ秒以内に) 実行する場合は、まさにそれを実行していることになります。srand
同じ値で呼び出すと、rand
.
への perldoc ページを参照してくださいsrand
。
ドキュメントで言及されていることの 1 つは、最初に呼び出さrand
ずに呼び出すとsrand
、Perl が実際に呼び出すというsrand
ことです。srand
したがって、そもそもスクリプトで を呼び出す必要はありません。
srand
ドキュメントでは、エントロピーが失われるため、プロセスごとに複数回呼び出すことも強くお勧めしています。
Perl の専門家ではありませんが、これは間違いなくループの 1 回の繰り返しが 1 ミリ秒より高速であるためです。そのため、srand 関数は同じシード値で複数回呼び出されます。for ループの外で乱数ジェネレーターを初期化する (または完全に省略する) 必要があります。ループ内では、単に rand を使用します。