C# Random.Next总是返回相同的值
这真的很奇怪,我不明白为什么会这样。在foreach循环中,我迭代一个类a集合,对于每个类,我调用C# Random.Next总是返回相同的值,c#,math,random,C#,Math,Random,这真的很奇怪,我不明白为什么会这样。在foreach循环中,我迭代一个类a集合,对于每个类,我调用Count()方法,其中r1和r2数字从范围[-1,1]生成。问题在于Random.Next为每个实例返回相同的“随机”数。当第一个实例的结果为0和-1时,将从以下实例返回相同的结果。拜托,你能告诉我为什么会这样吗?而且,我不能在每个类A实例中得到不同的结果。代码如下: class a { Random rnd = new Random(); private void Count() {
Count()
方法,其中r1
和r2
数字从范围[-1,1]生成。问题在于Random.Next
为每个实例返回相同的“随机”数。当第一个实例的结果为0和-1时,将从以下实例返回相同的结果。拜托,你能告诉我为什么会这样吗?而且,我不能在每个类A实例中得到不同的结果。代码如下:
class a
{
Random rnd = new Random();
private void Count()
{
int r1 = rnd.Next(-1, 1);
int r2 = rnd.Next(-1, 1);
}
}
class b
{
List<a> listofA=new list<a>();
foreach (a ACLASS in listofA)
{
ACLASS.Count();
}
}
a类
{
随机rnd=新随机();
私有无效计数()
{
int r1=rnd.Next(-1,1);
int r2=rnd.Next(-1,1);
}
}
b类
{
List listofA=新列表();
foreach(列表中的ACLASS)
{
ACLASS.Count();
}
}
问题是您创建的随机类的实例在时间上过于接近
当您创建一个Random
对象时,它将使用系统时钟中的一个值作为种子。如果创建的Random
实例在时间上过于接近,则它们都将使用相同的随机序列进行种子设定
创建单个Random
对象,并在创建“a”类实例时将其引用传递给构造函数,而不是为每个“a”实例创建一个Random
对象。为每个a实例包含一个随机实例。听起来它们都得到了相同的默认种子值。您可能希望为所有a实例创建一个静态random并重复使用它,或者为a构造函数中的random()实例提供一个种子值。您正在创建一个非常接近的random
新实例(您的循环非常紧密),因此每个实例都有效地使用相同的种子值
更好的方法是创建一个实例并将其传递给Count
方法
您可能知道下一点,但为了完整起见,我将在这里包括它:
有关于这方面的详细信息,但基本上您的问题是您正在使用的方法生成:
大于或等于minValue且小于maxValue的32位有符号整数;也就是说,返回值的范围包括minValue,但不包括maxValue。如果minValue等于maxValue,则返回minValue
因此,您的调用将返回-1或0。对该类的所有实例使用一个静态随机数生成器
class a
{
private static Random rnd;
static a() {
rnd = new Random();
}
private void Count()
{
int r1 = rnd.Next(-1, 2);
int r2 = rnd.Next(-1, 2);
}
}
请注意,将数字范围改为-1,1而不是-1,0我认为在这个范围内,它也可以返回1,并且它们只需要0和-1?@Svante编辑了问题,使间隔打开以匹配代码示例。最初的问题指定了一个封闭的时间间隔,尽管没有使用精确的语言。我认为代码不正确,我将恢复问题以指定一个闭合间隔。@tvanfosson您能告诉我为什么这样做吗?我不明白做这个静力学怎么会给你带来随机性。我知道它有效,但不是为什么。他们在时间上仍然非常接近。谢谢。@johnny当它被创建为实例变量时,Random
的构造函数会快速连续执行两次。由于它使用当前时间作为种子,这可能导致两个随机数生成器使用相同的伪随机数序列,因此它们在锁步中返回相同的值。使用单个随机数生成器,在类的静态构造函数中初始化一次,从单个伪随机序列返回不同的数字,给出随机数生成器所期望的行为。我也忘了,我以前在为俱乐部制作宾果纸盒时也遇到过同样的问题,我使用了人类所知的最糟糕的技巧:将线程暂停2毫秒,既没有经验又疯狂。。。够疯狂的了,我有一个创建随机名称的类,它在所有东西的顶部都有一个静态随机声明。