c#Random同じ乱数を迅速に連続的に生成するソリューション

2130 ワード

コードは次のとおりです.

 
namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Random d = new Random();
Console.WriteLine(d.Next(100));
}
}
}
}

理論的には、このプログラムは100個の異なる0~100の整数を生成しますが、実際には最初の数字が異なる以外に、残りの99個の数字はランダムな99個の同じ数字を生成します!中間にデバッグポイントを入れるかMessageBoxを使う.show()の方式は正確に100個の異なる乱数を得ることができます!どうして?まさか一時停止するの?コードを変更します.

 
namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Random d = new Random();
Thread.Sleep(15);
Console.WriteLine(d.Next(100));
}
}
}
}

再稼働後、出力された数字はついにランダムになり、15ミリ秒以上の一時停止が正常になり、1ミリ秒だけ一時停止すると5-6個連続のような乱数が規則的に現れ、5ミリ秒の一時停止に変更すると、この繰り返しが同じ乱数を生み出す概率は2-3個になります!ネットで2日間苦労して検索したが、何の役にも立たなかったが、CSDNフォーラムではすぐに解決策を与えた人がいた.

 
namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
Random d = new Random();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(d.Next(100));
}
}
}
}

ランダムオブジェクトをループの外に置くと問題が解決します!しかし、誰も説明できません.やはり擬似乱数のせいか、新たにランダムシードが生まれるたびに時間がかかるため、短時間で完全に重複する「擬似乱数」が発生するのだろう.また、ランダム数の重複しない確率を高める種子生成方法がネット上で見られた.

 
static int GetRandomSeed( )
{
byte[] bytes = new byte[4];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider( );
rng.GetBytes( bytes );
return BitConverter.ToInt32( bytes , 0 );
}
Random random = new Random( GetRandomSeed( ) );

:http://www.jb51.net/article/17406.htm


//<![CDATA[
//<![CDATA[
google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);
//]]>