経緯
C#でランダムな数値を生成したいと思い、Random
クラスを使って実装しました。
しかし、実際に動作させてみると毎回同じ数値が生成されてしまうという現象に直面しました。
今回はその原因と、毎回異なるランダムな値を生成するための正しい方法についてまとめました。
問題のあるコード(うまくいかなかった例)
以下のコードは、.txt
ファイルの行数を取得し、その行数の中からランダムにインデックスを生成する処理です。
int lineCount = File.ReadLines(path).Count(); // .txtファイルの行数をカウント
Random random = new Random(lineCount); // ランダム生成器を初期化
int mori = random.Next(lineCount); // ランダムな行番号を取得
一見正しく見えるこのコードですが、new Random(lineCount)
の部分が問題です。
ここで与えているシード値が固定されているため、毎回同じ乱数列が生成されてしまいます。
その結果、random.Next()
の結果も毎回同じ値となり、「ランダムでない」状態になります。
解決策:シード値に毎回異なる値を与える
正しくランダムな値を得るためには、Random
インスタンスに毎回異なるシード値を与える必要があります。
このとき便利なのが、Guid.NewGuid().GetHashCode()
を使う方法です。
int lineCount = File.ReadLines(path).Count(); // .txtファイルの行数をカウント
Random random = new Random(Guid.NewGuid().GetHashCode()); // 毎回異なるシード値を生成
int mori = random.Next(0, lineCount); // ランダムな行番号を取得
このようにすることで、実行のたびに異なるシードが使用され、毎回異なる乱数が生成されます。
まとめ
C#でRandom
を使う際、毎回同じ値が出る原因の多くはシード値の固定にあります。
これを回避するには、Guid.NewGuid().GetHashCode()
などを使って、毎回異なるシード値で初期化する必要があります。
特にランダム抽選やシャッフルなど、ランダム性が重要なアプリケーションでは、シードの扱いが結果に大きく影響します。
今回の方法を活用して、確実に「ランダム」な動作を実現してください。
最後までお読みいただき、ありがとうございました。