プログラミングではランダムな値を扱うシーンが多くあります。ゲームの敵出現位置、テストデータ生成、くじ引き機能など、乱数は幅広い用途を持ちます。この記事では初心者向けにC#での乱数生成を解説し、使い方から注意点まで丁寧に説明します!
乱数とは何か
乱数は予測できない数値のことです。厳密には真の乱数と疑似乱数がありますが、プログラミングで使うのは疑似乱数です。疑似乱数はアルゴリズムにより決まった手順で生成されますが、見た目はランダムに見えます。まずはC#標準のSystem.Random
クラスを見ていきましょう。
System.Randomクラスの使い方
C#には疑似乱数を生成するSystem.Random
クラスが用意されています。非常に手軽に扱えるため、まずはこちらを覚えましょう。
インスタンスの生成
2行目のように乱数の種(シード値)を省略すると、実行時刻などをもとに自動でシードが設定されます。5行目のようにシード値を指定すると、毎回同じ順番で同じ値を生成するRandom
クラスを生成できます。
// シードを省略した例
var rnd = new Random();
// シード値を指定する例(同じシードで同じ乱数列を生成)
var seededRnd = new Random(12345);
Nextメソッド
整数の乱数を生成するにはRandom
クラスのNext
メソッドを使います。
rnd.Next()
:0以上の32bit整数を返すrnd.Next(maxValue)
:0以上maxValue未満の整数を返すrnd.Next(minValue, maxValue)
:minValue以上maxValue未満の整数を返す
var rnd = new Random();
int a = rnd.Next(); // 例: 0 ~ 2147483647
int b = rnd.Next(10); // 例: 0 ~ 9
int c = rnd.Next(1, 7); // 例: 1 ~ 6(サイコロ)
NextDoubleメソッド
小数点以下を含む乱数が欲しいときはRandom
クラスのNextDouble
メソッドを使います。
rnd.NextDouble()
:0.0以上1.0未満のdouble
を返す
var rnd = new Random();
double d = rnd.NextDouble(); // 例: 0.0 ~ 0.999...
double scaled = rnd.NextDouble() * 100; // 0.0 ~ 99.999...
シード値について
シード値とは乱数の初期値です。同じシードを使うと同じ乱数列が得られます。
- デバッグ時に特定の乱数列で動作を確認したい場合に有用
- 毎回異なる乱数列が欲しい場合はシードを省略するか、時刻を利用
ただし、短時間で複数のRandom
クラスを生成すると、同じシードになる可能性があります。
(自動で設定されるシード値が同じ実行時間などで設定されて同じ値になってしまうことがあるため。)
乱数生成の注意点
乱数生成時に陥りやすいポイントをまとめます。
- 短時間に何度も
new Random()
すると同じシードになる可能性がある - マルチスレッド環境では
Random
はスレッドセーフでない - 大量の乱数を生成するときはパフォーマンスを意識する
対策として、Random
のインスタンスを使い回したり、スレッドごとに専用インスタンスを用意すると良いでしょう。
実用例:数当てゲーム
C#の乱数の実用例として、簡単な数当てゲームでRandom
を試してみましょう。
この例では、1~100までの整数値をランダムで取得し、入力された整数と比較して当たっているかどうかを確認しています。
using System;
class NumberGuess
{
static void Main()
{
var rnd = new Random();
int answer = rnd.Next(1, 101);
int guess;
Console.WriteLine("1から100までの数を当ててください。");
do
{
Console.Write("予想: ");
guess = int.Parse(Console.ReadLine());
if (guess < answer) Console.WriteLine("もっと大きいです。");
else if (guess > answer) Console.WriteLine("もっと小さいです。");
} while (guess != answer);
Console.WriteLine("正解です!");
}
}
8行目でNext(1, 101)
を使い、1〜100の範囲で値を生成しています。
より安全な乱数が必要な場合
暗号処理などのセキュリティ要件が高い機能では、よりセキュアな乱数が必要になります。そのような場面では、暗号的に強力な乱数を生成するSystem.Security.Cryptography
のRandomNumberGenerator
や.NET 6
以降のRandomNumberGenerator.GetInt32
を使いましょう。
using System.Security.Cryptography;
int secureValue = RandomNumberGenerator.GetInt32(1, 101);
まとめ
C#の乱数生成はSystem.Random
が基本です。
- インスタンスを使い回し、同じ乱数列にならないよう注意する
Next
やNextDouble
で整数・小数の乱数を生成- 高度なセキュリティ用途には
RandomNumberGenerator
を使う
この記事で紹介したポイントを押さえれば、初心者の方でもスムーズに乱数を扱えるようになります。ぜひ実際に手を動かして、乱数機能を活用してください!