ループ反復における乱数の繰り返し
次の問題を考えてみましょう: 15 回の反復を実行するループ内で、dh.setDoors() メソッドと呼ばれます。 setDoors() 内で、srand(time(0)) が呼び出され、乱数生成のシードが設定されます。その後、carSetter = rand()%3 1 または Decider = rand()%2 1 などの式を使用して乱数が生成されます。
carSetter と Decider の値を監視すると、各ループ反復を通じて値が一定であることがわかります。ただし、異なるループ実行間で変更します。ループには 15 回の独立した反復が含まれているため、この動作は予期せぬものであり、各ランダム値が変化するはずであることを示唆しています。
原因の調査
問題は srand( time(0)) 各反復の開始時に。各ループでシードをリセットすることにより、擬似乱数のシーケンスは反復内の time(0) の定数値によって事実上固定されます。 time(0) はループ全体で同じままであるため、同じ乱数シーケンスが生成されます。
問題の解決
この問題に対処するには、次のことをお勧めします。乱数発生器を初期化するのは、各ループ反復内ではなく、プログラムの開始時に 1 回だけです。これにより、ループの反復ごとに異なる乱数シーケンスが使用されるようになります。
修正された実装は次のようになります。
srand(time(0)); // Call srand() once at the start of the program while (...) { x = rand(); y = rand(); }
この変更により、x と y の値は次のように変わります。ループを繰り返し、さまざまな乱数シーケンスの望ましい動作を生成します。
以上がループ反復で乱数が繰り返されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。