【C#.NET解説】Randomクラスでランダムな数値や文字列を生成しゲームやセキュリティにも活用できる最強の乱数生成技術まとめ

2024年11月11日月曜日

基本

t f B! P L

名前空間: System

名前空間 System

Randomクラスとは何かを理解せよ

我が声を聞け、知を求める戦士たちよ。混沌の中から秩序を見出すには、偶然すらも意図のもとに操らねばならぬ。C#の「Random」クラスは、まさに乱数の運命を司る者――数の戦において勝利をもたらす刃となる存在だ。

このクラスを使えば、整数、浮動小数、バイト配列など、さまざまな形の乱数を生成できる。運に委ねるのではなく、運を味方につける手段として「Random」を使うのだ。

Randomクラスの基本的な機能と使い方

Randomクラスは、コンストラクタを用いてインスタンスを生成し、`Next()` や `NextDouble()`、`NextBytes()` などのメソッドを通じて乱数を得る。

まずは最も基本的な使い方を示そう。以下は0〜9の整数を生成する例だ。

C#

Random rand = new Random();
int number = rand.Next(10); // 0〜9の整数が得られる

このようにして、闘いの場におけるランダムな選択肢を生成するのだ。

乱数が使われる場面とRandom使用時の注意点

Randomクラスは以下のような場面で特に重宝される。

  • ゲームでの敵の行動決定やアイテムドロップ
  • UIの変化(ランダムな色やメッセージ)
  • データのサンプリング
  • セキュリティ上のテストや疑似暗号用途

しかし、戦いには策略が必要なように、Randomの使い方にも慎重さが求められる。同じタイミングで複数インスタンスを生成すると、内部のシード値が重複し、同じ値が出やすくなる危険がある。

以下のように、同じシードで生成されたRandomは、毎回同じ数列を返してしまう。

C#

Random rand1 = new Random(100);
Random rand2 = new Random(100);

Console.WriteLine(rand1.Next()); // 乱数1
Console.WriteLine(rand2.Next()); // 同じ乱数が出力される 

乱数の多様性を保つためには、シード値を明示せずに1回だけ生成し、それを使い回すのが得策だ。

実践で役立つRandomのメソッドとその応用コード

Randomクラスの武器(メソッド)には以下のようなものがある。

  • Next():整数の乱数を返す
  • Next(int maxValue):0〜maxValue-1の整数を返す
  • Next(int minValue, int maxValue):指定範囲の整数を返す
  • NextDouble():0.0以上1.0未満の浮動小数点数を返す
  • NextBytes(byte[] buffer):バイト配列に乱数を格納する

以下にすべてのメソッドを組み合わせた使用例を示す。

C#

Random rand = new Random();

// 整数:0〜9
int a = rand.Next(10);

// 整数:50〜99
int b = rand.Next(50, 100);

// 浮動小数:0.0〜1.0未満
double c = rand.NextDouble();

// バイト配列
byte\[] bytes = new byte\[5];
rand.NextBytes(bytes); 

これらの武器を自在に使いこなすことが、勝利への道を切り開く。

Randomクラスでランダムな文字列や選択処理を実装する

次は少し実践的な技じゃ。ランダムな文字列や配列の中からの選択は、ゲームロジックやガチャ要素、ランダムメッセージなどで役立つ。

以下は、アルファベットからランダムな文字列を生成する例だ。

C#

string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Random rand = new Random();
string result = "";

for (int i = 0; i < 6; i++)
{
int index = rand.Next(chars.Length);
result += chars\[index];
}

Console.WriteLine(result); // 例:QWZEPT 

また、リストからランダムに要素を選ぶことも可能だ。

C#

List<string> weapons = new List<string> { "剣", "槍", "弓", "斧" };
string choice = weapons[rand.Next(weapons.Count)];
Console.WriteLine($"選ばれし武器:{choice}");

その他にも活用できるRandomのテクニック集

以下は戦の知略として覚えておくと便利なテクニックである。

  1. 配列のシャッフル(Fisher–Yates法)
  2. 色のランダム生成
  3. グラフィックでのランダムな配置
  4. 乱数によりアニメーションの変化を制御
  5. ランダムなタイミングでのイベント発火

ここでは、配列シャッフルの例を紹介する。

C#

void Shuffle(int[] array)
{
    Random rand = new Random();
    for (int i = array.Length - 1; i > 0; i--)
    {
        int j = rand.Next(i + 1);
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

// 使用例
int\[] numbers = { 1, 2, 3, 4, 5 };
Shuffle(numbers); 

これにより、敵の配置やアイテムの並び順にランダム性をもたらすことができよう。偶然を操ること、それこそが戦略の一手なのだ。

自己紹介

普段、Windowsアプリ作ってます。WEBアプリ?知らない。

このブログを検索

QooQ