繁体   English   中英

在调试模式下,为什么会得到随机数?

[英]Why do I get random numbers when I am in debug mode?

Ive的构造函数具有“人口”类:

private Individual[] m_population;
    public Population() {
        m_population = new Individual[POP_SIZE];
        for (int i = 0; i < POP_SIZE; i++) {
            m_population[i] = new Individual();
            m_population[i].randGenes();
        }
        //some other code here
    }

在个人类内部,我有randGenes()方法:

Random rand2 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);

        public void randGenes()
        {
            for (int i = 0; i < SIZE; ++i)
            {
                for (int j = 0; j < SIZE; j++)
                {
                    this.setGene(i, j, rand2.Next(1));
                }
            }
        }

对于10个人中的每一个,我只需要一组25个radnom 1和0。 但是我总是为10个人中的每一个得到相同的集合,当我对它进行更多的修饰时,我只会得到0。 只有当我进入调试模式时,我才能获得真正的随机数。 我到处都看到应该在方法和/或循环之外创建新的随机数,所以我不知道下一步该怎么做?

编辑我的问题不是该问题的重复,因为那里提供的答案没有帮助我。 但是,对我有帮助的是我在下面授予的答案。

rand2似乎是一个实例变量,因此您为每个对象创建一个新的随机数生成器。 由于Ticks是一个以毫秒为单位的数字,因此,如果您的代码执行得足够快,则每个Individual的种子都将是相同的,并且所有RNG都返回相同的序列。

闯入调试器时不会发生这种情况,因为会引入人为的延迟。

对每个“ Individual使用相同的“ Random对象,或者对RNG进行不同的播种。

这是因为您在这么短的时间内有效地创建了Random的新实例,所以Random无法使用不同的种子-它基于当前时间(如您的示例所示,很明显)。 在调试模式下工作的原因是,调试器的开销使您的代码运行速度变慢,这意味着在创建随机实例之间已经经过了一段时间,这意味着它可以使用不同的值进行播种。 (例如,相同的种子将始终产生相同的随机数集)。 您应该创建一个静态变量来存储Random的实例,并在程序中的所有位置使用相同的random实例。 您应该可以将随机更改为

static Random rand2 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);

它应该开始工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM