【问题标题】:Where should I put my random number generation to get random results?我应该把我的随机数生成放在哪里以获得随机结果?
【发布时间】:2020-05-01 21:26:45
【问题描述】:

我有一个嵌套系统,如下面的伪代码所述(随机加权多数算法的一部分):

function1() { 
    //for 100 iterations:
        function2()
        // grab logistics
}
function2() {
    // create a random seed/generator
    random_device rd;
    mt19937 gen(rd);
    //for 1000 iterations:
        function3(gen);
}

function3(gen) {
    // grab number from uniform_real_distribution using gen
    // then use that number against differing weights
    // such that higher weight gets more territory in the uniform distribution for its desired outcome
    // that is in a system with weights (1, 1/2) distributed over a uniform distribution (0,1)
    // outcome of weight 1 happens if dist lands (0,.6666) and outcome of weight 2 if dist lands (.6666, 1)
}

在上面的示例中,uniform_real_distribution 生成看似随机的数字,但 function1 总是以完全相同的结果结束。

然而,当我运行这个函数时,每次迭代都会得到相同的精确结果,即使其他两个函数应该是随机的。更糟糕的是,如果我将生成器从 mt19937 更改为 ranlux48,系统每次迭代都会得到完全相同的结果,但确切的结果将与 mt19937 得到的结果不同,这意味着我所做的一切都不是随机的-- 只依赖于生成器。

我需要有关如何解决此问题的指导,以便获得真正随机的结果。

gen 和 rd 应该放在哪里?我什至应该使用统一的实际分布吗?

如果我每次调用function3时都在函数3中创建gen,我仍然会得到非随机结果,实际上uniform_real_distribution每次都会生成完全相同的值

【问题讨论】:

  • 尝试创建一个最小的可重现示例,而不仅仅是伪代码
  • function2 不返回任何内容,因此其行为未定义(如果可以编译)
  • 尽早设置随机数生成器 (random_device rd; mt19937 gen(rd);) 并重新使用它,除非您有充分的理由不这样做。很贵。

标签: c++ random


【解决方案1】:

虽然您只显示了伪代码,但您似乎每次调用该函数时都在创建一个新的随机设备和生成器。这是不必要的昂贵,更重要的是,每次调用该函数时,您都会从随机生成器中获得相同的结果。对伪代码的最简单修改是使生成器静态化,如下所示:

function2() {
    // create a random seed/generator ONCE only
    static random_device rd;
    static mt19937 gen(rd);
    // work

【讨论】:

  • 是的,我只是自己发现了这个工作——我不了解 random_device 的属性,所以我实际上每次都用相同的种子播种 mt19937。此外,每次我调用该函数时,我都会重置种子,所以我会得到完全相同的结果。
  • @Robert 还要注意 MinGW 的 GCC 端口的旧(9.3 之前)版本。它是故意损坏的,并且总是返回相同的数字,因此您会知道它已损坏。不幸的是,事实证明这还不够明显,并导致一些不安全的程序和很多程序员感到困惑。
  • every time you call the function, you'll get the same results from the random generator 这是不正确的,除非随机设备损坏,std::random_device 的良好实现应该返回随机数。
【解决方案2】:

正如 user4581301 在 cmets 中指出的那样,我使用的是旧版本的 MinGW,其中 random_device 被破坏,每次都产生相同的种子。因此,由于我的随机生成器的范围,我会从同一个种子开始,每次都得到相同的结果。这实际上不是程序问题,而是编译器问题,这就是我感到困惑的原因!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2022-06-11
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多