乱数(ランダムな数値を生成)

乱数とは数字が不規則かつ等確率に現れるように配列されたものを指します。

C#でRandomクラスを使ってランダムな数値を取得する方法を紹介します。

Randomクラス

Randomクラスで乱数を生成する前にnewしてインスタンスを作成します。
インスタンスで作成する際は、int型のseed(種)が必要になります。

Random random = new Random(seed);

このseedを使って乱数を発生させます。同じseedの値の場合は、同じ乱数が発生します。

seedを指定しなければ内部的にPCの稼働時間を取得するEnvironment.TickCountがseedとして利用されます。

Environment.TickCountは、ミリ秒単位なので連続でRandomクラスのインスタンスを作るとseedが被る可能性がありますので注意が必要です。

Randomクラスは、乱数を生成するクラスですので複数作る必要はないです。使いまわしましょう。

整数のランダム値を生成する

まずは整数のランダム値の出し方を説明します。上記のRandomクラスのインスタンスは作ってあるものとします。

0以上のランダムな整数を生成する

0以上のランダムな整数を生成します。最大値は、integerの最大値「2,147,483,647」です。

//0以上のランダムな整数
int num = random.Next();

最大値を設定してランダムな整数を生成する

Nextメソッドに最大値を設定することもできます。たとえば0~99の数値を設定するには以下のようにします。最大値に設定した数値は乱数の中には含まれません。

//0以上のランダムな整数 最大値を指定
int num = random.Next(100);

もし100も含めたい場合は、random.Next(101)と最大値に+1してあげるのがよいかと思います。

最小値、最大値を指定してランダムな整数を生成する

Nextメソッドに最小値も設定することができます。以下が例です。

//10~29のランダムな整数 範囲を指定
int num = random.Next(10, 30);

この場合、最小値の10は乱数の対象ですが、最大値の30は対象ではありません。
10以上30未満の範囲で乱数が取得できます。

小数点の乱数を取得する

小数点を含むランダム値の出し方を説明します。上記のRandomクラスのインスタンスは作ってあるものとします。

0.0~1.0の浮動小数点(double)で乱数を取得する

浮動小数点の乱数を取得するには以下のようにします。

//0以上、1.0未満のランダムな浮動小数点を取得する
double num = random.NextDouble();

最大値を設定してランダムな浮動小数点(double)で乱数を取得する

NextDouble関数には最大値、最小値を引数として設定できません。そのため取得した乱数に係数をかけて取得する範囲を広くします。

//0以上の30.0未満のランダムな浮動小数点を取得する
double max_num = 30.0;
double num = random.NextDouble() * max_num;

最小値、最大値を指定してランダムな整数を生成する

さらに上記の計算でオフセットを考慮すれば最小値も設定できます。

//40.0以上、100.0未満のランダムな浮動小数点を取得する
double max_num1 = 100.0;
double min_num1 = 40.0;
double num1 = random.NextDouble() * (max_num1 - min_num1) + min_num1;

Console.WriteLine(num1);

//-10.0以上、10.0未満のランダムな浮動小数点を取得する
double max_num2 = 10.0;
double min_num2 = -10.0;
double num2 = random.NextDouble() * (max_num2 - min_num2) + min_num2;

Console.WriteLine(num2);

40.0以上、100.0未満で解説するとまずrandom.NextDouble() * (max_num1 - min_num1)で範囲を指定します。(max_num1 - min_num1)は60です。そうすると取得できる値は、0.0以上、60.0未満です。これに対し範囲をずらすために40.0(最小値)だけオフセットします。

結果、乱数の範囲が40.0以上、100.0未満になるということです。

まとめ

他にもBYTE配列にランダムに値を入れるNextBytesという関数があります。

//指定したバイト配列の要素に乱数を入れる
byte[] rand_bytes = new byte[10];
random.NextBytes(rand_bytes);

設定したすべての配列に乱数を入れます。Byteなので0~255の値が入るかと思います。

アプリを作る際は使ったことがないので、紹介だけさせていただこうと思います。

この記事が皆様のお役に立てたら幸いです。

タイトルとURLをコピーしました