2
//My trial program
#include<iostream>
#include<random>

using namespace std;

int main(){

    //USed to initialize (seed) the random number generator
    random_device sd{};

    // The random number generator
    mt19937 engine {sd()};

    //Uniformly distribute random numbers in [1...10]
    uniform_int_distribution <> dis{1, 50};

    //Generate a random integer
    int x {dis(engine)};

    //Print it 

    cout<<x<<"\n";

    return 0;

}

我已经使用上面的代码生成了 1 到 50 之间的随机数。但是每当我运行程序时,生成的随机数都是相同的。我正在学习的一门在线课程有这个代码,它在讲师的 clang 编译器上运行得非常好。我正在使用 gcc 编译器。谁能告诉我需要做什么?谢谢你!!

4

2 回答 2

2

来自std::random_device

如果非确定性源(例如硬件设备)对实现不可用,则 std::random_device 可以根据实现定义的伪随机数引擎来实现。在这种情况下,每个 std::random_device 对象都可以生成相同的数字序列。

尽管它对用户来说并不理想,但允许实现具有您描述的行为。

于 2017-08-28T14:01:36.717 回答
1

这里的问题是它std::random_device不一定是一个随机设备。它可以是未播种的包装器,rand每次使用时都会为您提供相同的值。这意味着您的种子engine将是相同的,这意味着它生成的伪随机序列也将是相同的。

解决此问题的一种方法是将电流用作种子,例如

auto seed = std::chrono::system_clock::now().time_since_epoch().count();
mt19937 engine {seed};

但这可以通过外部进程进行操作,并且粒度不是很细,因此同时播种的多个实例都可以产生相同的序列。

于 2017-08-28T14:01:08.000 回答