3

私がこれを持っている場合:(私はすでに変数を宣言しました)

random1 = new Random();
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random1.Next(1, 100));

それがあると、console.writelineを呼び出すたびに異なる番号が生成されるため、exが生成されます。10、55そしてもう一度20,60をやれば、基本的に毎回乱数がいいです。しかし、これを追加すると:

random2 = new Random();
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random2.Next(1, 100));
Console.WriteLine(random2.Next(1, 100));

Random1はランダムと同じ数を生成します!だからそれは元になります。5,54,5,54そして私がそれをもう一度やれば70,34,70,34。しかし、random2は新しいオブジェクトなので、なぜrandom1と同じ数を生成するのですか?

別の例:このようなクラスがある場合

 class RandomNumber
    {
        Random random = new Random();
        public int getrandomnumber { get { return random.Next(1, 5); } }
    }

これを行った後

randomnumberobject = new RandomNumber();
randomnumberobject2 = new RandomNumber();
Console.WriteLine(randomnumberobject.getrandomnumber);
Console.WriteLine(randomnumberobject2.getrandomnumber);

それらは乱数を生成しますが、両方ともまったく同じ乱数を生成します。したがって、初めてこの5,5を取得し、2回目はこの3,3というようになります。しかし、クラスをこれに変更すると

class RandomNumber
    {
        Random random;
        public int getrandomnumber { get { return random.Next(1, 5); } }
        public RandomNumber(Random random) { this.random = random; }
    }

そして代わりにこれを行う

   random = new Random();
   randomnumberobject = new RandomNumber(random);
   randomnumberobject2 = new RandomNumber(random);
   Console.WriteLine(randomnumberobject.getrandomnumber);
   Console.WriteLine(randomnumberobject2.getrandomnumber);

突然、両方とも異なる乱数を生成します!では、なぜこれが起こるのでしょうか?どういう理由ですか?覚えておいてください、私はまだ初心者のようなものです。

4

3 に答える 3

5

表示されるのは「設計による」です。つまり、クラスの実装方法が原因で発生します。使用するアルゴリズムには、この場合はクロックに基づく「シード」(開始状態の一種)が必要です。MSDNに記載されているとおり:

乱数の生成はシード値から始まります。同じシードを繰り返し使用すると、同じ一連の番号が生成されます。異なるシーケンスを生成する1つの方法は、シード値を時間依存にすることです。これにより、ランダムの新しいインスタンスごとに異なるシリーズが生成されます。デフォルトでは、Randomクラスのパラメーターなしのコンストラクターは、システムクロックを使用してシード値を生成しますが、パラメーター化されたコンストラクターは、現在の時刻のティック数に基づいてInt32値を取得できます。ただし、クロックの解像度は有限であるため、パラメーターなしのコンストラクターを使用して異なるRandomオブジェクトを連続して作成すると、同一の乱数シーケンスを生成する乱数ジェネレーターが作成されます。

これは基本的に、2つのRandomオブジェクトがパラメーターなしのコンストラクターを使用してほぼ同時に作成される場合、それらはクロックに基づいて同じ「開始状態」で初期化されるため、同じ乱数シーケンスを生成することを意味します。

于 2013-02-16T13:21:18.237 に答える
0

乱数の生成は、ほとんどのプログラミング言語のシード値に基づいて機能します。このシードは通常、現在の時間値から取得されます。したがって、2つのランダムオブジェクトを互いに近くに宣言すると、CLRから同じシードを取得する可能性が高くなります。そのため、同じ番号が生成されます。

同じインスタンスを使用する場合、最初の2つの数値はすでに乱数列から取得されているため、次の2つは同じではありません。

このような状況では、明示的なシードを使用します(int値でオーバーロードされるRandomのコンストラクター)。

于 2013-02-16T13:23:30.123 に答える
0

最後の例では毎回再シードしているため、再シードしない場合、ランダムオブジェクトは毎回同じ乱数プールからプルされます。

        var random1 = new Random(DateTime.Now.Millisecond);
        Console.WriteLine(random1.Next(1, 100));
        Console.WriteLine(random1.Next(1, 100));
        Console.WriteLine(random1.Next(1, 100));
        Console.WriteLine(random1.Next(1, 100));

        var random2 = new Random(DateTime.Now.Millisecond);
        Console.WriteLine(random2.Next(1, 100));
        Console.WriteLine(random2.Next(1, 100));
于 2013-02-16T13:23:32.500 に答える