C#乱数発生の3つの方法(回転)


ブログ園
リンク:乱数の3つの方法
乱数の定義は、生成されたすべての数字は関係ない.
実際のアプリケーションでは、一意の注文番号を生成する必要があるなど、乱数が用いられることが多い.
C#で乱数を取得するには、次の3つの方法があります.
一.Randomクラス
Randomクラスのデフォルトの無パラメトリック構造関数は、現在のシステムクロックがシードであることに基づいて、一連のアルゴリズムを行い、要求範囲内の擬似乱数を得ることができる.1 Random rd =  new   Random(); 2 int   i = rd.Next();
この乱数はいくつかの要求の低い目標を達成することができるが,高い同時性の場合,Randomクラスが取得したシステムクロックシードが完全に同じに近い場合,ここではサイクルを用いて例を挙げる繰り返しが発生する可能性が高い.1 for   ( int   i = 0; i < 10; i++) 2 { 3      Random rd =  new   Random();   // 4      Console.WriteLine(rd.Next().ToString()); 5 }
この例では同じ「乱数」を10個出力.
顕著な問題:Randomが擬似乱数を行うアルゴリズムは固定されているため、同じ種子から計算する数字は必然的に同じである.現代のコンピュータの動作速度では、このサイクルはほぼ瞬時に完了する、種子が一致するため、10回のサイクルで同じ乱数を出力する場合がある.
二.Guidクラス
System.Guid
GUID(Globally Unique Identifier)グローバル一意識別子
GUIDの計算には、ハードウェアのIDコード、現時点時間など、本機で取ることができる数字が多く用いられている.算出する128ビットの整数(16バイト)は、一意の出力に近づけることができる.1 Console.WriteLine(Guid.NewGuid().ToString());
計算結果はxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
三.RNGCRyptoServiceProviderクラス
System.Security.Cryptography.RNGCryptoServiceProvider 
RNGCRyptoServiceProviderは暗号化サービスプロバイダ(CSP)が提供する実装を用いて暗号化乱数生成器(RNG)を実現する1 RNGCryptoServiceProvider csp =  new   RNGCryptoServiceProvider(); 2 byte [] byteCsp =  new   byte [10]; 3 csp.GetBytes(byteCsp); 4 Console.WriteLine(BitConverter.ToString(byteCsp));
このクラスはより厳密なアルゴリズムを用いる.したがって、以下のようにループにおいても、算出する乱数は異なる.1 for   ( int   i = 0; i < 10; i++) 2 { 3      RNGCryptoServiceProvider csp =  new   RNGCryptoServiceProvider(); 4      byte [] byteCsp =  new   byte [10]; 5      csp.GetBytes(byteCsp); 6      Console.WriteLine(BitConverter.ToString(byteCsp)); 7 } 1 RNGCryptoServiceProvider , , .
四.Membership.GeneratePassword()
メンバーシップはキャラクターの権限管理をしやすいクラスで、たまたま面白い方法を見つけて、乱数と縁を拭きましょう01 public   static   string   GeneratePassword( int   length,  int   numberOfNonAlphanumericCharacters); 02 // 03 // : 04 //     。 05 // 06 // : 07 //   numberOfNonAlphanumericCharacters: 08 //     。 09 // 10 //   length: 11 //     。 1 128 。 12 // 13 // : 14 //     。
例:1 for   ( int   i = 0; i < 10; i++) 2 { 3      Response.Write(Membership.GeneratePassword(20, 1) +  "<br>" ); 4 }
結果は
C!&^HoTNv3!ZHkK9BAbu
azLgER)JJ-UW8q*14yz*
I3qnb]Zxu16ht!kKZ!Q*
9U:MAQ&c1x)^aed@xe**
oL(%4JvfbP&t5*Hpl4l-
6@zj$CnhW&D+|xOf:qIk
A/!Di&l*tY$QaMH0gyzY
z^wu6{1BMq7D^+WU]>f$
1OgIJS3&09fw0F9.|aXA
8F+Gy+L{O6x{SfugME*%