.net column
.NET開発者のためのブログメディア

ソースコード

C#のRandomの使い方|Randomクラスの機能と乱数配列の生成

2021年04月27日
SE
C#のRandomを使うときどのようなことに注意すればいいですか。
PM
Randomは比較的予測できてしまうため、暗号の生成に利用するのは注意が必要です。

C#のRandomとは?


C#のSystem.Randomは乱数を取得できるクラスです。乱数とは予測ができないバラバラの数のことで、ゲームや暗号処理に必須の機能です。Randomクラスでは主にNextメソッドを使用します。まずは以下のC#サンプルを実行してみてください。

結果は以下のようになります。なお乱数なので実行するたびに結果は変わります。

7は0から9までの乱数です。

Randomクラスの機能

RandomクラスのNextメソッドには、2つのパラメータで発生する乱数の範囲指定をします。1つ目のパラメータは最小の数、2つ目のパラメータは最大の数+1を指定します。+1であることに注意しましょう。

Randomは他にも以下のような使い方ができます。

実行結果は以下になります。

-3は-10から-1までの乱数です。
492691439は0から32bitのint最大値未満までの乱数です。
0.40832412774130894は0.から1.0未満までの浮動小数点数の乱数です。

乱数配列の生成

C#のRandomクラスはbyte型の乱数の配列を簡単に作ることができます。以下のC#サンプルを実行してみてください。

実行結果は以下のようになります。

146 188 168 77 255 14 82 139 150 224

セキュアな乱数を取得

ただし上の方法では乱数として脆弱性があります。Randomは比較的予測できてしまうため、暗号の生成に利用するのは危険です。そのためC#にはRNGCryptoServiceProviderという、より安全性の高い乱数生成アルゴリズムを用いたクラスがあります。

使用方法は以下のC#サンプルの通りで、使い方はRandomクラスとあまり変わりません。ただしパフォーマンスはRandomクラスよりずっと悪いので、リアルタイム性を要求されるゲームで何度も呼び出すような利用は避けた方が良いでしょう。

結果は以下のようになります。

146 236 248 202 125 80 2 225 140 162

.NET Core 2.0から改善されたRandomクラス

なおRandomクラスの解説記事を読むと、以下のように連続でRandomクラスを生成して利用すると同じ値になってしまうと書かれていることがあります。

しかし最新の環境でこれを実行すると、期待通りランダムな結果が得られます。これは.NET Core 2.0から対策がされて、連続で呼び出しても内部で適切なシード(乱数の種)による乱数を得られるようになったからです。

シードは特に指定しなくても良い

それまではRandomクラス内部ではシードは単純に時間のTickCount値を使っていたため、同時刻に複数の乱数を生成すると同じ結果になってしまっていました。.NET Core 2.0ではアルゴリズムが改善されてその心配がなくなったのです。

なお以下のようにRandomクラス生成時にシードを指定することも可能です。

ただし指定する場合は、シードが必ずユニーク値である配慮が必要になりますし、以下のような程度のシードであれば予測されてしまう可能性もあります。なので.NET Core 2.0以後であれば、シードは指定しない方がむしろ良いでしょう。

数当てゲームのサンプル

では具体的にRandomクラスを使った簡単なゲームを作りましょう。以下のC#サンプルをご覧ください。

サンプルの解説 その1

上のC#サンプルの解説をします。まずフィールドのseikaiにRandomのNextメソッドで1から10までの乱数を代入します。そしてcountを1で初期化します。その後にwhile(true)で無限ループを開始します。

Console.ReadLine()で文字入力を受け付けます。結果は文字列なので、int.TryParseによりint型に変換します。この時文字列が数値でない場合、TryParseはfalseになるためエラーとします。

また数値でも、1から10ではない場合も同様にエラーとします。continueでwhileループの頭に戻ります。

サンプルの解説 その2

入力された数値がseikaiと同じならcountを表示してbreakで終了します。そうでない場合はseikaiと比較して、大きいか小さいかのヒントを出して、countを1加算してまたループします。実行すると以下のようになります。

1から10までの数を当てて下さい。
abc
数値を入力してください。
11
1から10までを入力してください。
5
もっと大きいです。
6
もっと大きいです。
7
正解です。3回目で当たりました。

SE
C#でゲームを作るときRandomクラスを使用するときの注意点、理解しました。
PM
今回解説したことをしっかり理解して、今後活用してください。

C#のRandomで楽しいプログラムを作ろう

C#のRandomクラスの使い方について解説しましたが、いかがでしたでしょうか。ゲームが主な用途になるので、楽しんで利用することが出来ると思います。

ただし暗号生成に使う場合はセキュリティを考慮する必要があり、その乱数生成アルゴリズムもとても奥が深くなっています。興味のある人はぜひC#の乱数の機能を調べてみて下さい。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags

Jobs