函数的随机整数总是返回相同的数字 - 为什么?

soc*_*ley 3 c++ random stl

我目前正在学习C++并且对random_device有疑问.

我正试图模拟monty hall问题.为此,我需要随机整数来随机选择门.因此,我尝试创建一个为此目的返回随机整数的函数.

int guessGetRandomIndex() {
    std::random_device rd; // obtain a random number from hardware
    std::mt19937 eng(rd()); // seed the generator
    std::uniform_int_distribution<> distr(0, 2);
    return distr(eng);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在main()中获取随机整数时,我会保持相同的数字.

    vector<int> v = {0, 1, 2, 3, 4, 5};
for (auto & j : v){
    int random = guessGetRandomIndex();
    std::cout << random << ' ';
}    
 Output: 1 1 1 1 1 etc.
Run Code Online (Sandbox Code Playgroud)

然而,当我将随机设备放在主循环中并执行相同操作时,我设法得到随机整数.

    std::random_device rd; // obtain a random number from hardware
std::mt19937 eng(rd()); // seed the generator
std::uniform_int_distribution<> distr(0, 2); // define the range
vector<int> v = {0, 1, 2, 3, 4, 5};
for (auto & j : v){

    std::cout << distr(eng) << ' ';
}   

 Output: 1 2 1 2 0 1
Run Code Online (Sandbox Code Playgroud)

这是为什么?我只是试图封装随机设备.我认为每次调用函数时会产生新的随机数,类似于Pythons random.randint,但我认为C++中还有其他的东西.

提前致谢.

Vit*_*meo 7

你每次打电话都要创建一个新的std::random_devicestd::mt19937生成器guessGetRandomIndex.static将它们标记为或通过引用将它们传递给函数以避免重新实例化它们:

int guessGetRandomIndex() {
    static std::random_device rd; // obtain a random number from hardware
    static std::mt19937 eng(rd()); // seed the generator
    std::uniform_int_distribution<> distr(0, 2);
    return distr(eng);
}
Run Code Online (Sandbox Code Playgroud)

为了生成伪随机数,标准库提供的生成器包含每次生成值时都会发生变化的内部状态.如果继续重新实例化生成器,内部状态将始终与其初始状态匹配,因此始终生成相同的数字.

  • `rand()`与标准库`<random>`模块无关 - 它是一个具有不同种子规则的C函数.请查看[其文档](http://en.cppreference.com/w/cpp/numeric/random/rand).它的使用是不鼓励的,因为它产生低质量的PRNG数字,它不是惯用的现代C++. (5认同)