【问题标题】:C++ 11 random number generation not working [duplicate]C ++ 11随机数生成不起作用[重复]
【发布时间】:2018-02-05 19:53:06
【问题描述】:
//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 编译器。谁能告诉我需要做什么?谢谢!!

【问题讨论】:

  • 不断更换种子
  • mt19937 引擎 {sd()};这里有任何兰特值
  • 你有机会使用 MinGW 吗? std::random_device 已经或曾经遇到过一些问题。
  • "//在[1...10] uniform_int_distribution dis{1, 50};中均匀分布随机数;":为什么注释代码是错误的。跨度>
  • @HariomSingh 我所指的代码在 mt19937 引擎 {sd()} 上没有任何 rand 值;它仍在工作。

标签: c++ random numbers mt19937


【解决方案1】:

来自std::random_device

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 如何解决这个限制,让它生成一个伪随机码?
    • @AbhiJoe 为其添加时间戳。
    • @AbhiJoe 刚刚更新了答案
    猜你喜欢
    • 2013-11-09
    • 2015-07-12
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多