1

for ループで perl スクリプトを反復処理し、スクリプトで使用srand(time¦$$)して乱数をシードしています。

私の出力では、for ループを使用する代わりに一度に 1 つずつ実行すると、個々の結果を取得したときに結果が繰り返されます。これはsrandラインのせい?助言がありますか?

ありがとう!

4

2 に答える 2

14

同じ番号で を呼び出すと、次の呼び出しsrandで返される一連の番号が同じになりrandます。したがって、srand(time() | $$)立て続けに (たとえば、まったく同じ秒以内に) 実行する場合は、まさにそれを実行していることになります。srand同じ値で呼び出すと、rand.

への perldoc ページを参照してくださいsrand

ドキュメントで言及されていることの 1 つは、最初に呼び出さrandずに呼び出すとsrand、Perl が実際に呼び出すというsrandことです。srandしたがって、そもそもスクリプトで を呼び出す必要はありません。

srandドキュメントでは、エントロピーが失われるため、プロセスごとに複数回呼び出すことも強くお勧めしています。

于 2012-09-01T10:51:05.583 に答える
3

Perl の専門家ではありませんが、これは間違いなくループの 1 回の繰り返しが 1 ミリ秒より高速であるためです。そのため、srand 関数は同じシード値で複数回呼び出されます。for ループの外で乱数ジェネレーターを初期化する (または完全に省略する) 必要があります。ループ内では、単に rand を使用します。

于 2012-09-01T10:53:12.790 に答える