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

标签 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);

然而,当我尝试在 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.

然而,当我将随机设备放入主循环并在那里执行相同操作时,我设法获得了随机整数。

    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

这是为什么呢?我只是想封装随机设备。我认为每次调用类似于 Pythons random.randint 的函数时它都会生成新的随机数,但我认为 C++ 中还有其他事情发生。

提前致谢。

最佳答案

每次调用 guessGetRandomIndex 时,您都会创建一个新的 std::random_devicestd::mt19937 生成器。将它们标记为 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);
}

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

关于c++ - 来自函数的随机整数总是返回相同的数字 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41489979/

相关文章:

java - 为 Java 生成整数的随机数生成器

C++ 模板 : allocator for template container

c++ - 循环条件中的空 vector<Point> size() 会导致奇怪的行为

c++ - 无法使 C++ 程序正确计数

c++ - 为什么添加颜色附件会导致速度降低 3 倍?

c++ - 在 eclipse cdt 中链接静态库

javascript - 从 javascript 中的字符串列表中选择随机条目

java - Math.random() 生成相同的数字

c++ - STL map<string, string>,给key赋0值导致编译错误

c++ - 如何使用 merge 合并两个映射/多映射 (C++11 STL)