【问题标题】:Random Number Generator C++ Error in CMDCMD 中的随机数生成器 C++ 错误
【发布时间】:2015-08-29 02:26:59
【问题描述】:

我正在尝试制作一个随机数生成器,以生成一个介于 0 和 999 之间的数字。

我最初确实在从 time(null) 生成 mt19937 的种子的地方运行它,但发现这会导致数字每秒更改一次,并且当我从内部再次调用它时速度不够快for 循环。

我正在使用 code::blocks 来编译我的代码,它编译时没有错误,但是当我运行代码时,我在 cmd 中出现错误。

Error: terminate called after throwing an instance of 'std::runtime_error'
  what():  random_device::random_device(const std::string&)

我是不是做错了什么?

#include <iostream>
#include <random>

using namespace std;

//Random Number Generator
int numGen() {

    //Random Number Generator
    random_device rd;
    mt19937 mt(rd());
    uniform_int_distribution<int> dist(0, 999);

    for (int I = 0; I < 6; i++) {
        cout <<dist(mt) << " ";
    }

    cout <<endl;
}

更新:

我现在从 Visual Studio 运行完全相同的代码,没有错误。

【问题讨论】:

  • 我在一个为你编译和执行的网站上检查了这段代码,运行没有问题
  • code::blocks is compatible with c++ 11 below option is enabled: "Have g++ follow the C++11 ISO C++ langage standard [-std=c++11]"
  • 为什么每次都重新播种?
  • 这样它就改变了从 for 循环中每次通过时生成的“dist”的值。

标签: c++ c++11 random


【解决方案1】:

std::random_device 实际上并不需要实现。

http://www.cplusplus.com/reference/random/random_device/

第三段。如果设备不好,他们会抛出异常。尝试使用不同的种子 RNG。

【讨论】:

  • 我试过 mt19937(time(NULL));但这仅每秒更新一次。这并不快。然后我可以找到一种生成它的唯一方法是强制 for 循环每秒滴答一次。
  • 您只为 rng 播种一次。
【解决方案2】:

您的函数永远不会返回值。因为你有一个int 返回类型,你的函数必须返回一个可以转换为int 的东西。如果您不想返回任何内容,可以将函数更改为 void

由于您的异常引用了构造函数名称,因此似乎无法创建随机设备。 C++14 标准 26.5.6.4 有

抛出:从异常派生的实现定义类型的值,如果 random_device 无法初始化。

【讨论】:

  • 问题仍然存在,即使是 void。
猜你喜欢
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多