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 を使用します。