C++ 我应该在哪里生成随机数以获得随机结果?

C++ 我应该在哪里生成随机数以获得随机结果?,c++,random,C++,Random,我有一个嵌套系统,如随机加权多数算法下面的伪代码所述: function1() { //for 100 iterations: function2() // grab logistics } function2() { // create a random seed/generator random_device rd; mt19937 gen(rd); //for 1000 iterations: fun

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

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)
}
在上面的示例中,均匀实分布生成看似随机数的结果,但函数1的结果总是完全相同

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

我需要关于如何解决这个问题的指导,这样我才能得到真正随机的结果

我应该把gen和rd放在哪里?我是否应该使用均匀实分布


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

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

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

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

尝试创建一个最小的可复制示例,而不仅仅是pseudocodefunction2不返回任何内容,因此如果它编译设置随机数生成器random_设备rd,则其行为是未定义的;mt19937 genrd;除非你有充分的理由不这样做,否则尽早使用它。它很贵。是的,我刚刚发现这是我自己的工作-我不了解随机_设备的属性,所以我实际上每次都用相同的种子播种mt19937。此外,每次调用该函数时,我都会重置种子,以便得到完全相同的结果。@Robert还注意MinGW的GCC端口的旧9.3版本。它是故意损坏的,并且总是返回相同的数字,因此您将知道它已损坏。不幸的是,事实证明这不够明显,并导致一些不安全的程序和许多困惑的程序员。每次调用该函数时,您都会从随机生成器中得到相同的结果。这是错误的,除非随机设备被破坏,否则std::random_设备的良好实现应该返回随机数。