我有两个不同的实现随机函数:
版本1:
public double myRnd()
{
Random rnd = new Random();
return rnd.NextDouble();
}
//-- Generate Random Number for Delaer
double DealersCard = myRnd();
//-- Generate Players 4 Random Number
double Box1Card = myRnd();
double Box2Card = myRnd();
double Box3Card = myRnd();
double Box4Card = myRnd();
Run Code Online (Sandbox Code Playgroud)
版本2:
//-- Create Random Object
var rnd = new Random();
//-- Generate Random Number for Delaer
double DealersCard = rnd.NextDouble();
//-- Generate Players 4 Random Number
double Box1Card = rnd.NextDouble();
double Box2Card = rnd.NextDouble();
double Box3Card = rnd.NextDouble();
double Box4Card = rnd.NextDouble();
Run Code Online (Sandbox Code Playgroud)
哪种方法更好?
版本2 要好得多.版本1完全坏了.
版本1 Random为每个数字重新创建.Random由种子Environment.TickCount,它只是改变每1-16ms.因此,myRnd对于该时间间隔内的所有呼叫,您将获得相同的随机数.
此外,版本2更快,因为它不需要重新创建Random.
类似的问题经常被问到,通常是那些实施版本1并且想知道为什么不适用的人.例如:随机数生成器仅生成一个随机数
状态的MSDN文档Random:
随机数生成从种子值开始.如果重复使用相同的种子,则生成相同的数字序列.产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列.默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间中的滴答数采用Int32值.但是,由于时钟具有有限的分辨率,因此使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列.
http://msdn.microsoft.com/en-us/library/system.random.aspx
我已经在Microsoft Connect上提交了一项改进请求,因为这是一个非常常见的错误.