C#における乱数の生成:包括的なガイド
1. Random
クラスの理解
C#のSystem.Random
クラスは、擬似乱数を生成するための主要なツールです。これらは真の乱数ではありません(物理的なエントロピー源が必要です)が、ほとんどのアプリケーションではランダムに見えるシーケンスです。これらは、初期のシード値から決定的に生成されます。同じシードは同じシーケンスを生成します。これはデバッグに役立ちますが、真のランダム性を必要とするアプリケーションでは覚えておくことが重要です。
2. 乱数の生成
中心となるメソッドはRandom.Next()
です。主なオーバーロードは以下のとおりです。
Next()
:int.MaxValue
未満の非負の整数を返します。Next(maxValue)
:maxValue
未満の非負の整数を返します(maxValue
は正でなければなりません)。Next(minValue, maxValue)
:minValue
以上、maxValue
未満の整数を返します(maxValue
>minValue
)。
例:
using System;
public class RandomNumberGenerator
{
public static void Main(string[] args)
{
Random random = new Random();
int randomNumber1 = random.Next(10); // 0から9
Console.WriteLine($"乱数1: {randomNumber1}");
int randomNumber2 = random.Next(5, 15); // 5から14
Console.WriteLine($"乱数2: {randomNumber2}");
}
}
3. 浮動小数点数の乱数の生成
0.0(包含)と1.0(非包含)の間の乱数の倍精度浮動小数点数を生成するには、random.NextDouble()
を使用します。他の範囲については、これをスケールおよびシフトします。
double randomNumber = random.NextDouble() * 100; // 0.0から100.0
4. 効率的な複数乱数の生成
多くの数値を生成する場合は、効率のために単一のRandom
インスタンスを再利用します。(システムクロックによってシードされたデフォルトのコンストラクタを使用して)複数のインスタンスをすばやく作成すると、同様のシーケンスにつながることがあり、見かけ上のランダム性が低下します。
Random random = new Random();
for (int i = 0; i < 10; i++)
{
int randomNumber = random.Next(1, 101); // 1から100(包含)
Console.WriteLine($"乱数{i + 1}: {randomNumber}");
}
5. 乱数生成器のシード設定
Random
コンストラクタにシードを提供することで、シーケンスを制御します。
- 再現性: 同じシード=同じシーケンス(テストに不可欠)。
- 特定のシーケンス: シミュレーションに便利。
Random random1 = new Random(12345);
Console.WriteLine($"シード12345の乱数: {random1.Next(100)}");
Random random2 = new Random(12345);
Console.WriteLine($"シード12345の乱数(再): {random2.Next(100)}"); // 上と同じ
Random random3 = new Random(); // 現在の時刻をシードとして使用
Console.WriteLine($"現在の時刻をシードとした乱数: {random3.Next(100)}");
6. 暗号的に安全な乱数
セキュリティに敏感なアプリケーションでは、決してSystem.Random
を使用しないでください。代わりにSystem.Security.Cryptography.RandomNumberGenerator
を使用してください。
7. 結論
Random
クラスは、簡単な擬似乱数生成を提供します。シード設定とインスタンスの再利用を理解することは、再現性と効率の両方にとって重要です。セキュリティには、暗号化RNGを優先してください。
8. FAQ
Q: 数値は真にランダムですか? A: いいえ、擬似ランダムです。ランダムに見えるように見えますが、決定的に生成されます。
Q: 浮動小数点数の乱数を生成するにはどうすればよいですか? A: 必要に応じてrandom.NextDouble()
を使用してスケール/シフトします。
Q: 暗号的に安全な乱数はどうですか? A: System.Security.Cryptography.RandomNumberGenerator
を使用してください。