Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9301

【C#, VB.NET】乱数の生成

$
0
0

概要

ここではC#とVB.NETでランダムな数値を生成する方法を紹介します。
C#/VB.NETは簡単に乱数を生成できます!

乱数はよく使うので、覚えておくと便利です。

開発環境

IDE: Visual Studio 2015
OS : Windows 10

※自分の環境です

Randomクラス

C#/VB.NETで乱数を生成するにはRandomクラスを使用します。
まずはnew演算子でRandomオブジェクトを作成します。
オブジェクトの作成は変数宣言とほぼ同じです。

rnd.cs
Randomrnd=newRandom();
rnd.vb
DimrndAsNewRandom()' 以下のような書き方でも可' Dim rnd As Random = New Random()

はい、これだけで乱数を生成する準備は完了です!ね、簡単でしょ?
ただし、C#では以下のようにSystemが明示的にインポートされていないと使えないので注意しましょう。ですが、ソースを新規作成した時に大体は自動的に付加されるのであまり気にしなくてもよいでしょう。

rnd.cs
usingSystem;

Nextメソッド

先ほど作成したRandomオブジェクトのNextメソッドを使用することでランダムな数値を得ることが出来ます。
RandomオブジェクトにはNextメソッドが3つ定義されていますが、その中でも個人的によく使うものを紹介します。

Next(int minValue, int maxValue)メソッド

よく使うメソッドなので是非覚えましょう。
これを呼び出すとminValueからmaxValueまでの範囲でランダムな整数値を取得できます。
ただし、maxValueは含まれないので注意しましょう。
つまり、minValue以上、maxValue未満のint型の整数値が返ることになります。
呼び出し方法の例は以下のようになります。

rnd.cs
Randomrnd=newRandom();// Randomオブジェクトの作成rnd.Next(1,10);//1以上10未満の値がランダムに出力
rnd.vb
DimrndAsNewRandom()' Randomオブジェクトの作成rnd.Next(1,10)'1以上10未満の値がランダムに出力

使用例

0から50までの整数値をランダムに取得し、取得した整数値を表示してそれが25以上なら"A"、そうでなければ"B"と表示するコードです。実行結果は、実行する毎に変化します。

sample.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceTestCS{classProgram{staticvoidMain(string[]args){Randomrnd=newRandom();// Randomオブジェクトを作成intx=rnd.Next(0,50);// 0から50までの値をランダムに取得Console.WriteLine(x.ToString());if(x>=25){Console.WriteLine("A");}else{Console.WriteLine("B");}Console.ReadLine();}}}
Sample.vb
ModuleModule1SubMain()DimrndAsNewRandom()' Randomオブジェクトの作成DimxAsInteger=rnd.Next(0,50)' 0から50までの値をランダムに取得Console.WriteLine(x)Ifx>=25ThenConsole.WriteLine("A")ElseConsole.WriteLine("B")EndIfConsole.ReadLine()EndSubEndModule

Randomクラスという存在を知っていれば乱数は超簡単に生成できます!!

ちなみに、ランダムな0以上1.0未満の実数値を取得したい場合はNextDoubleメソッドで取得できます。

Randomクラスのもう1つのコンストラクタ

コンストラクタはオブジェクトを作成する時に呼ばれます。詳しいことは別の記事で載せる予定です。
Randomクラスのコンストラクタには引数無しのタイプと整数値を引数として渡すタイプの2つがあります。

・Random()
・Random(int seed)

以下のソースは下側のコンストラクタでRandomオブジェクトを作成しています。
これを実行するとランダムな数値は得られていますが、実行結果は何回やっても同じになります。

seedsRnd.cs
Randomrnd=newRandom(3);// Randomオブジェクトを作成for(inti=0;i<5;i++)Console.WriteLine(rnd.Next(0,10));Console.ReadLine();

ゲームのリプレイ機能とかで使えそうですね。

注意点

以前、私がゲームを作ってた時に引っ掛かったので一応書いておきます。
Randomオブジェクトを作成するとき、場所に注意が必要です。
例えば、以下のようなソースがあったとします。

Sample2.cs
for(inti=0;i<10;i++){Randomrnd=newRandom();Console.WriteLine(rnd.Next(0,10));}Console.ReadLine();
Sample2.vb
ForiAsInteger=0To9DimrndAsNewRandom()Console.WriteLine(rnd.Next(0,10))NextConsole.ReadLine()

以上のソースを実行すると結果はどうなるでしょうか?

0から10までのランダムな値が10個出てくるだろう……

……と、思っていた自分がいました。

実際はそうではなく、同じ数値が連続で出力される現象が起こります。
そのせいで昔、どこがおかしいのか分からなくてずっと悩んでいた時がありました。

対策方法としては、宣言文をループの外に出すというのが良いでしょう。
以下は上記のソースを修正したソースになります。

seedsRnd.cs
Randomrnd=newRandom(3);// Randomオブジェクトを作成for(inti=0;i<5;i++)Console.WriteLine(rnd.Next(0,10));Console.ReadLine();

ゲームのリプレイ機能とかで使えそうですね。

注意点

以前、私がゲームを作ってた時に引っ掛かったので一応書いておきます。
Randomオブジェクトを作成するとき、場所に注意が必要です。
例えば、以下のようなソースがあったとします。

Sample2.cs
Randomrnd=newRandom();for(inti=0;i<10;i++){Console.WriteLine(rnd.Next(0,10));}Console.ReadLine();
Sample2.vb
DimrndAsNewRandom()ForiAsInteger=0To9Console.WriteLine(rnd.Next(0,10))NextConsole.ReadLine()

このようにすれば、同じ数値が連続して出てくることは無くなります。低確率で連続することはあります。

まとめ

・C#/VBで乱数を生成したいときはRandomオブジェクトを作成して準備する
・実際に生成する時は、RandomオブジェクトのNextメソッドを呼び出す。

参考文献

Random クラス(Microsoft Docs)


Viewing all articles
Browse latest Browse all 9301

Trending Articles