|
.NET TIPS 乱数を生成するには?デジタルアドバンテージ2003/06/06 |
![]() |
|
|
|
乱数(ランダムな数値)を生成するにはRandomクラス(System名前空間)を使用する。具体的には、まずRandomクラスのインスタンスを作成し、Nextメソッドを呼び出せばよい。例えば次のコードでは、0から99までの間のランダムな整数を1つ得ることができる。
Random rnd = new Random();
int randomNumber = rnd.Next(100);
以降、Nextメソッドを呼び出すたびに別のランダムな整数が得られる。同様に、NextDoubleメソッドは、0.0から1.0の間のdouble型の乱数を生成する。また、NextBytesメソッドではバイト配列をパラメータで指定することにより、各要素に乱数が格納される。
Randomクラスを使用する場合の注意点
コンピュータで乱数を生成する場合、ある数値をシード値(seed:種)として用い、その値を基にして特定の演算により乱数を生成していく。このため同じシード値を使用した場合、発生する乱数はまったく同じものとなる。
Randomクラスで既定のコンストラクタ(パラメータのないコンストラクタ)を使用してインスタンスを作成した場合、そのシード値にはEnvironmentクラス(System名前空間)のTickCountプロパティが使用される。このプロパティは、PCを最後に起動してからの経過時間を返すのだが、その値はミリ秒単位である。このため、連続して複数のRandomクラスのインスタンスを作成した場合、シード値が同じインスタンスが作成されてしまう可能性がある。次のサンプル・プログラムはこの現象を実験するためのものだ。
|
|
| 連続してRandomクラスのインスタンスを作成するC#のサンプル・プログラム(random1.cs) | |
出力例を見ると、異なるインスタンスにもかかわらず、同じ乱数の系列が生成されてしまっているものがあることが分かる(そして、生成される乱数列の変化は、TickCountプロパティ値の変化と同期している)。このような乱数は、その目的からまったく不適切である。
このような場合には、パラメータにシード値を指定できるコンストラクタのバージョンを使用し、プログラムで適当なシード値を与えてやればよい。そのように書き換えたものが次のサンプル・プログラムだ。
|
|
| シート値を変えながらRandomクラスのインスタンスを作成するC#のサンプル・プログラム(random2.cs) | |
このサンプル・プログラムではシード値を1ずつ増やしているだけだが、十分使えそうな乱数が得られている。
より厳密な乱数の生成
詳細はここでは述べないが、暗号化に使用する乱数列が必要な場合には、より厳密な乱数を生成するためのRNGCryptoServiceProviderクラス(System.Security.Cryptography名前空間)も用意されている。このクラスは同名前空間の抽象クラスであるRandomNumberGeneratorクラスを実装したものだ。次のコードのように、このクラスのGetBytesメソッド(あるいはGetNonZeroBytesメソッド)を使用して、バイト配列に乱数列を得ることができる。
byte[] randoms = new byte[100];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randoms);
こちらのクラスではシード値の生成もより厳密になっているため、Randomクラスのような問題は発生しない。![]()
| カテゴリ:クラス・ライブラリ 処理対象:乱数 使用ライブラリ:Randomクラス(System名前空間) 使用ライブラリ:Environmentクラス(System名前空間) 使用ライブラリ:RNGCryptoServiceProviderクラス(System.Security.Cryptography名前空間) |
|
||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


