ループで乱数を効率的に生成する
次のコードスニペットは、ループ内で乱数を生成する際の一般的な落とし穴を示しています。
この関数をタイトなループで繰り返し呼び出すと、例:// Inefficient random number generation public static int RandomNumber(int min, int max) { Random random = new Random(); return random.Next(min, max); }
は、多くの場合、
byte[] mac = new byte[6]; for (int x = 0; x < 6; x++) { mac[x] = (byte)RandomNumber(0, 255); }
が再目立っているためです。ループが迅速に実行された場合、クロックは大幅に変更されておらず、同じシードが発生し、したがって「ランダム」数値のシーケンスが発生します。
mac
Random
解決策:単一の共有インスタンス
正しいアプローチでは、単一のインスタンスを作成し、ループ全体で再利用することが含まれます。 マルチスレッドアプリケーションでは、スレッドの安全性も考慮する必要があります。 改良されたバージョンは次のとおりです
Random
インスタンスを使用することにより、1つの
// Efficient and thread-safe random number generation private static readonly Random random = new Random(); private static readonly object syncLock = new object(); public static int RandomNumber(int min, int max) { lock (syncLock) { return random.Next(min, max); } }
メソッドにアクセスするスレッドのみが保証されます。 これにより、生成された数値の完全性とランダム性が維持されます。
以上が`random.next()`に繰り返し呼び出しが同一の数字を生成するのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。