C# Programming

C#乱数生成完全ガイド

Spread the love

C#における乱数の生成:包括的なガイド

  1. Randomクラスの理解
  2. 乱数の生成
  3. 浮動小数点数の乱数の生成
  4. 効率的な複数乱数の生成
  5. 乱数生成器のシード設定
  6. 暗号的に安全な乱数
  7. 結論
  8. FAQ

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を使用してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です