我有两种不同的实现随机函数:
版本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();
版本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();
哪种方法更好?
答案 0 :(得分:9)
版本2 很多更好。版本1完全破碎。
版本1为每个数字重新创建Random
。 Random
播种Environment.TickCount
,每1-16毫秒更改一次。因此,对于该时间间隔内myRnd
的所有呼叫,您将获得相同的随机数。
此外,版本2更快,因为它不需要重新创建Random
。
类似的问题经常被问到,通常是那些实施版本1并且想知道为什么不适用的人。例如:Random number generator only generating one random number
Random
州的MSDN文档:
随机数生成从种子值开始。如果重复使用相同的种子,则生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列。默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间中的滴答数采用Int32值。但是,由于时钟具有有限的分辨率,使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列。
http://msdn.microsoft.com/en-us/library/system.random.aspx
我已经提交improvement request on Microsoft Connect,因为这是一个非常常见的错误。
答案 1 :(得分:1)
第一个效果不佳。
任何随机函数中的点是它是伪随机的,你得到的随机值取决于种子。创建Random
对象时,会以当前时间播种。
因此,当您每次想要一个随机数时创建一个新的Random
对象时,您最终会一次又一次地播种当前时间,这可能会导致重复获得相同的数字(因为当前时间可能会没有改变,取决于它使用的计时器的准确度和分辨率。)
Random
类用于创建一个对象,您可以从中获取随机数的序列。