乱数の生成

C#:
乱数の生成

どのようにして:

C#でランダムな数を生成する最も一般的な方法は、System.Random クラスを使用することです。こちらがその使用例を示すシンプルな例です:

using System;

public class RandomNumberExample
{
    static void Main(string[] args)
    {
        Random random = new Random();
        int randomNumber = random.Next(1, 100); // 1と99の間の数を生成
        Console.WriteLine($"Random number: {randomNumber}");
    }
}

これは、例えば以下のようなランダムな数を出力します:

Random number: 42

0.0から1.0の間のランダムな浮動小数点数を生成するには、NextDoubleメソッドを使用できます:

double randomDouble = random.NextDouble();
Console.WriteLine($"Random double: {randomDouble}");

セキュリティに敏感なアプリケーションで暗号学的なランダム性が必要な場合は、System.Security.CryptographyにあるRNGCryptoServiceProviderクラスを使用する方がよいでしょう:

using System;
using System.Security.Cryptography;

public class SecureRandomExample
{
    static void Main()
    {
        byte[] randomNumber = new byte[4]; // 4バイトのランダム数を生成
        using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
        {
            rng.GetBytes(randomNumber);
        }
        int value = BitConverter.ToInt32(randomNumber, 0);
        Console.WriteLine($"Cryptographically secure random number: {value}");
    }
}

より詳しく

年々、C#におけるランダム数の生成は進化してきました。初めは、System.Randomクラスが疑似ランダム数を生成するための主要な方法でした。特定のシード値が与えられると、それは同じ数のシーケンスを生み出しますので、これは疑似ランダムと言えます。これはデバッグやテストの再現性のために役立ちます。

基本的なニーズには十分ですが、System.Randomはスレッドセーフではなく、予測可能な結果を生み出すことがあります。これはセキュリティに依存するアプリケーションには適していません。この制限により、より安全だがよりリソースを要するRNGCryptoServiceProviderが暗号学的なランダム性のために導入されました。

.NET Coreや.NET 5+では、ランダム数を安全に生成するためのより現代的で使いやすいオプションとして意図されたSystem.Security.CryptographyRandomNumberGeneratorクラスが、RNGCryptoServiceProviderと比較して代替として登場しています。

C#でランダム数を生成する各方法は、アプリケーションの要件に応じてそれぞれの場所があります。ほとんどのアプリケーションではSystem.Randomで十分ですが、安全で予測不可能なランダム数が必要な場合、暗号学的クラスが強固な代替手段を提供します。