広告あり
[スポンサーリンク]

【C#】初心者向け”乱数”入門ガイド:Randomクラスの基本と実践例

C#

プログラミングではランダムな値を扱うシーンが多くあります。ゲームの敵出現位置、テストデータ生成、くじ引き機能など、乱数は幅広い用途を持ちます。この記事では初心者向けに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.CryptographyRandomNumberGenerator.NET 6以降のRandomNumberGenerator.GetInt32を使いましょう。

using System.Security.Cryptography;

int secureValue = RandomNumberGenerator.GetInt32(1, 101);

まとめ

C#の乱数生成はSystem.Randomが基本です。

  • インスタンスを使い回し、同じ乱数列にならないよう注意する
  • NextNextDoubleで整数・小数の乱数を生成
  • 高度なセキュリティ用途にはRandomNumberGeneratorを使う

この記事で紹介したポイントを押さえれば、初心者の方でもスムーズに乱数を扱えるようになります。ぜひ実際に手を動かして、乱数機能を活用してください!

[スポンサーリンク]

\ おすすめ書籍 /



この記事を書いた人
だんご丸

鉄鋼系SE歴 10年
金融系SE歴  6年
現在は音楽出版社のSE

●保有資格
初級システムアドミニストレータ
(現:ITパスポート)
基本情報技術者
応用情報技術者
情報セキュリティスペシャリスト
(現:情報処理安全確保支援士)
ネットワークスペシャリスト
情報セキュリティマネジメント
AWS認定クラウドプラクティショナー
AWS認定ソリューションアーキテクト - アソシエイト

だんご丸をフォローする
C#
[スポンサーリンク]
だんご丸をフォローする
[スポンサーリンク]
タイトルとURLをコピーしました