【问题标题】:Why do I get random numbers when I am in debug mode?为什么我在调试模式下会得到随机数?
【发布时间】:2016-07-04 06:44:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# random


    【解决方案1】:

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

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

    它应该开始工作了。

    【讨论】:

    • 解决了,我确实尝试使用静态随机但我没有使用日期时间作为种子...
    • 您可能应该完全省略 DateTime 种子,因为无论如何这是默认行为。很高兴听到它现在对你有用:)
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多