ホームページ >バックエンド開発 >C++ >乱数ジェネレーターが同じ数を繰り返し生成するのはなぜですか?

乱数ジェネレーターが同じ数を繰り返し生成するのはなぜですか?

DDD
DDDオリジナル
2025-02-03 08:32:091051ブラウズ

Why Does My Random Number Generator Produce the Same Number Repeatedly?

プログラミングで繰り返し乱数を理解して修正します

頻繁なプログラミングの問題には、同じ数を繰り返し出力する乱数ジェネレーター(RNG)が含まれます。 これは通常、RNGがループ内で複数回再開され、新しいインスタンスを作成するときに発生します。 Random

問題が説明されている

この問題を例で調べてみましょう:

デバッグは、各ループ反復中にさまざまな値を示す場合があります。ただし、ループの後にブレークポイントを設定すると、
<code class="language-csharp">public static int RandomNumber(int min, int max) {
    Random random = new Random(); // Problem: New instance each time
    return random.Next(min, max);
}

byte[] mac = new byte[6];
for (int x = 0; x < 6; x++) {
    mac[x] = (byte)RandomNumber(0, 255);
}</code>
配列内のすべての要素が同じ値を保持していることがわかります。

macソリューション:単一のランダムインスタンス

根本的な原因は、ループ内で新しいオブジェクトを作成することです。 多くの場合、システムクロックを使用するためにシステムクロックを使用しているため、迅速な連続して複数のインスタンスを作成すると、同一の種子値、したがって繰り返される数字が得られます。

ソリューションはシンプルです。コード全体で

の単一の静的インスタンスを使用してください:Random Random

マルチスレッドとスレッドの安全性Random

<code class="language-csharp">private static readonly Random random = new Random();

public static int RandomNumber(int min, int max) {
    return random.Next(min, max);
}

byte[] mac = new byte[6];
for (int x = 0; x < 6; x++) {
    mac[x] = (byte)RandomNumber(0, 255);
}</code>
マルチスレッドアプリケーションでは、共有

インスタンスにアクセスするには、人種条件を防ぐために同期する必要があります。 これは、ロックを使用して実現できます

以上が乱数ジェネレーターが同じ数を繰り返し生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。