可能重复:
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'值。
这里有什么问题?
答案 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实例静态或为每个实例化查找唯一的种子值以解决问题。