为什么这个随机数生成器生成相同的数字?

Zer*_*ang 2 c++ random

第一个起作用,但是第二个总是返回相同的值。为什么会发生这种情况,我应该如何解决呢?

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0, 1);

    for(int i = 0; i < 10; i++) {

        std::cout << dis(gen) << std::endl;
    }return 0;
}
Run Code Online (Sandbox Code Playgroud)

一个不起作用:

double generateRandomNumber() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0, 1);

    return dis(gen);
}



int main() {
    for(int i = 0; i < 10; i++) {
        std::cout << generateRandomNumber() << std::endl;
    }return 0;
}
Run Code Online (Sandbox Code Playgroud)

ois*_*syn 5

您在哪个平台上工作?std::random_device如果不存在生成随机数的硬件或操作系统功能,则允许使用伪RNG。它可能使用当前时间进行初始化,在这种情况下,您所调用的时间间隔可能相隔太近,以至于“当前时间”无法采用其他值。

但是,正如评论中提到的那样,并不意味着要使用这种方式。一个简单的解决方法是声明as rd和。适当的解决方法是将RNG的初始化移出需要随机数的函数,因此也可以将其用于需要随机数的其他函数。genstatic