2011-12-08 51 views
2

可能重复:
Random number generator not working the way I had planned (C#)
Why does it appear that my random number generator isn't random in C#?相同的随机值

我有问题的随机值

 int weight = 0; 
     Random random = new Random(); 
     for (int i = 0; i < entriesCount; i++) 
     { 
      weight = random.Next(10); 
     this.weights[i] = weight; 
     } 

此代码是我对象的构造函数。我创建3个不同的对象

Object object1 = new Object(2); 
Object object2 = new Object(2); 
Object object3 = new Object(2); 

对于每个对象,我会得到相同的随机值,例如:4,5 | 4,5 | 4,5

每次我以相同的顺序得到相同的值。我不`吨明白为什么>请帮

最好的问候, 的Dawid

+0

下面是一些关于这个问题好读:http://csharpindepth.com/Articles/Chapter12/Random.aspx – Oded

+0

看到这里的解释:创建一个随机对象,而不是多个(HTTP:// MSDN .microsoft.com/en-us/library/system.random.aspx) – Smash

回答

3

问题是你每次都要创建一个新的Random。当您创建Random类的实例时,它将当前时间用作种子。如果您多次执行此操作,您会得到相同的种子值,因此不同的随机实例会输出相同的结果。

为了解决这个问题,您需要确保您的随机播种单独播种,或者共享并使用一个随机实例。最简单的选择是仅使随机实例静态:

class YourClass 
{ 
    private static Random randomGenerator = new Random(); 

    public YourClass(int entriesCount) 
    { 
     int weight = 0; 
     for (int i = 0; i < entriesCount; i++) 
     { 
      weight = randomGenerator.Next(10); 
      this.weights[i] = weight; 
     } 
    } 
    // .. rest of your class 

这将导致该类总是重复使用相同的随机实例,所以你每次得到不同的值。

请注意,如果你打算在多线程场景中使用它,你还必须同步对随机实例的访问,或者提出一种不同的方法(例如保存种子值和使用像Interlocked.Increment增加它并从每个实例种下一个新的随机,等等)。

+0

非常感谢。它的作品完美! – Fixus

0

随机是一个伪随机数发生器,这意味着输出的顺序为任何给定的种子一样。如果将种子传递给构造函数,则会得到不同的顺序。

0

据我所知,一个随机是由系统时间播种,除非你另有指定。它根据这个数字生成数字。当你几乎完全同时创建它们时,它们具有相同的种子,并且几乎总是返回相同的数字和序列。

任何简单的修复方法都是创建一个静态随机所有实例共享,并且只需调用该静态对象上的.Next()。

0

MSDN documentation

“使用参数构造紧密相继创建产生的随机数相同的序列随机数生成器来创建不同的随机的对象”