一尘不染

使用 C++11 随机库生成随机数

javascript

正如标题所示,我试图找出一种使用新的 C++11<random>库生成随机数的方法。我已经用这段代码试过了:

std::default_random_engine generator;
std::uniform_real_distribution<double> uniform_distance(1, 10.001);

我的代码的问题是每次编译和运行它时,它总是生成相同的数字。所以我的问题是随机库中的哪些其他函数可以在真正随机的同时实现这一点?

对于我的特定用例,我试图在该范围内获得一个值[1, 10]


阅读 94

收藏
2022-06-28

共1个答案

一尘不染

来自微软的 Stephan T. Lavavej(stl) 在 Going Native 上就如何使用新的 C++11 随机函数以及为什么不使用rand(). 在其中,他包含了一张幻灯片,基本上可以解决您的问题。我已经从下面的幻灯片中复制了代码。

你可以在这里看到他的完整演讲:

#include <random>
#include <iostream>

int main() {
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_real_distribution<double> dist(1.0, 10.0);

    for (int i=0; i<16; ++i)
        std::cout << dist(mt) << "\n";
}

我们使用random_device一次来播种名为 的随机数生成器mtrandom_device()比 慢mt19937,但它不需要播种,因为它从您的操作系统请求随机数据(它将来自不同的位置,例如RdRand)。


查看这个问题/答案,它似乎uniform_real_distribution返回了[a, b)您想要的范围内的数字[a, b]。为此,我们uniform_real_distibution实际上应该如下所示:

std::uniform_real_distribution<double> dist(1, std::nextafter(10, DBL_MAX));
2022-06-28