即使使用种子,C++ <random>分布也不是随机的

Yaj*_*obe 1 c++ random

我想在main函数之外生成随机数,但即使使用库并播种随机数生成器,输出也不是随机的.任何帮助表示赞赏.

#include <iostream>
#include <random>
#include <time.h>

int foo(std::mt19937 rng)
{
    std::uniform_int_distribution<int> distr(0, 9);

    return distr(rng);
}

int main()
{
    std::random_device rd;
    std::mt19937 rng(rd());

    for (int j=0; j<10; j++)
    {
        std::cout << foo(rng) << " ";
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

随着输出

5 5 5 5 5 5 5 5 5 5
Run Code Online (Sandbox Code Playgroud)

小智 7

int foo(std::mt19937 rng)
Run Code Online (Sandbox Code Playgroud)

您是按值传递std :: mt19937生成器,因此当您将生成器传递给函数时,它不会从main中获取数字,因此创建该生成器的副本,该副本仅在该函数内部进行修改,并不影响主要的那个.

您应该通过引用传递它,因此它会修改main中的那个,并且在每次调用中,生成器将创建不同的数字:

int foo(std::mt19937& rng)
Run Code Online (Sandbox Code Playgroud)