C# 同じ値が返る?Randomクラスを利用して6桁整数の乱数発生させる

乱数を発生させる

6桁の整数を発生させる

            Random rnd = new Random();
            int pwd = rnd.Next(100000, 999999);

seed値がポイントで、seed値に何も指定しない場合は、以下と同義になります。

            int seed = Environment.TickCount;
            Random rnd = new Random(seed);
            int pwd = rnd.Next(100000, 999999);

seed値を変更させるため

Environment.TickCount によってコンピューターが最後に起動してからの経過時間をミリ秒単位で取得しそれを指定しています。

.NET Framework では、既定のシード値は時間に依存します。 .NET Core では、既定のシード値は、スレッド静的、擬似乱数ジェネレーターによって生成されます。

乱数ジェネレーターのインスタンス化

上記の例は.NET Frameworkの事であり、.NET Coreではまた別のシード値が採用されています。

乱数ジェネレーター Random クラス

擬似乱数は、少数の数値から等しい確率で選択されます。 選択した数値は、数学的アルゴリズムを使用して選択するため、完全にはランダムではありません

Random クラス

シード値って何?

疑似乱数生成アルゴリズムの開始値の事。シード値は、明示的または暗黙的に指定できます。

同じシード値を利用すると、同じ一覧の乱数が生成されます。

例 シード値を揃える

            Random rnd = new Random(10);
            int pwd = rnd.Next(100000, 999999);

必ず同じ乱数が発生します。

乱数が同一になる可能性

1つのオブジェクトで、15ミリ秒以内に作成されたオブジェクトのシード値が同一になる可能性があります。

実行例はこちらに記載があります。

乱数ジェネレーターのインスタンス化

かなりタイミングが重ならないと同じにはなりませんが、まれに同じ値が生成される事があります。なので、このような場合はシード値を明示的に指定します。

1つ目

            int seed = Environment.TickCount;
            Random rnd = new Random(seed);
            int pwd = rnd.Next(100000, 999999);

2つ目

            int seed = Environment.TickCount;
            Random rnd = new Random(seed++);
            int pwd = rnd.Next(100000, 999999);

引数なしのコンストラクタを使用した場合はシード値にEnvironmentクラスのTick Countプロパティが設定されます。これを、かならず違う値が入るように指定すると上記の例のようになります。

まとめ

単一の6桁整数をランダムに生成したい場合は、

            Random rnd = new Random();
            int pwd = rnd.Next(100000, 999999);

でOK!