随机数字不起作用

时间:2011-04-03 18:37:41

标签: c#

  

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

您好,
我使用这个函数(在课堂上)随机化数字:

private int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}

public void Init()
{
    x = RandomNumber(0,500);
}

但是,如果我稍后调用多个对象来执行此操作:

Obj[] obj = new Obj[64];
for( int i = 0 ; i < 64 ; i++ )
{
    obj[i] = new Obj();
}
...
for( int i = 0 ; i < 64 ; i++ )
{
    obj[i].Init();
}

然后每个对象具有完全相同的'x'值。

这里有什么问题?

2 个答案:

答案 0 :(得分:5)

Random只应创建一次并在单个实例上调用Next

这是因为默认情况下Random由当前时间播种 - 如果在紧密循环中调用(就像你一样),种子将是相同的,伪随机算法的结果将主要是相同。

如果您将代码更改为此类代码,您将获得更好的结果:

private static Random random = new Random();
private int RandomNumber(int min, int max)
{
    return random.Next(min, max);
}

但是,这线程安全。如果您尝试在多线程应用程序中使用它,则会遇到问题。对于线程安全版本,我建议阅读并阅读Jon Skeet撰写的this文章。

答案 1 :(得分:2)

Random类是伪随机数生成器。它需要一个唯一的种子值来产生唯一的数字。

默认种子值基于当前时间,这将是相同的,因为所有对象都是在瞬间创建的。

使Random实例静态或为每个实例化查找唯一的种子值以解决问题。