当我处于调试模式时,为什么会得到随机数?

时间:2016-07-04 06:44:57

标签: c# random

我有一个类人口及其构造函数:

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
    }

在Individual类中,我有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。只有当我进入调试模式时,我才会得到真正随机的数字。 我到处看到新的随机应该在方法和/或循环之外创建,我这样做了,所以我不知道下一步该做什么?

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

2 个答案:

答案 0 :(得分:1)

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

当你因为引入人为延迟而闯入调试器时,这不会发生。

为每个Random使用相同的Individual对象,或以不同方式为RNG播种。

答案 1 :(得分:1)

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

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

它应该开始起作用了。