带有“std::runtime_error”的 C++0x random_device
Posted
技术标签:
【中文标题】带有“std::runtime_error”的 C++0x random_device【英文标题】:C++0x random_device with 'std::runtime_error' 【发布时间】:2013-03-31 02:17:54 【问题描述】:我是一名 C++ 初学者,我对 C++0x 随机数生成器有疑问。我想使用 Mersenne twister 引擎生成随机 int64_t 数字,并使用我之前找到的一些信息编写了一个函数:
#include <stdint.h>
#include <random>
int64_t MyRandomClass::generateInt64_t(int64_t minValue, int64_t maxValue)
std::random_device rd;
std::default_random_engine e( rd() );
unsigned char arr[8];
for(unsigned int i = 0; i < sizeof(arr); i++)
arr[i] = (unsigned char)e();
int64_t number = static_cast<int64_t>(arr[0]) | static_cast<int64_t>(arr[1]) << 8 | static_cast<int64_t>(arr[2]) << 16 | static_cast<int64_t>(arr[3]) << 24 | static_cast<int64_t>(arr[4]) << 32 | static_cast<int64_t>(arr[5]) << 40 | static_cast<int64_t>(arr[6]) << 48 | static_cast<int64_t>(arr[7]) << 56;
return (std::abs(number % (maxValue - minValue)) + minValue);
当我尝试在 Qt 应用程序中使用此代码时,我收到此错误:
terminate called after throwing an instance of 'std::runtime_error'
what(): random_device::random_device(const std::string&)
正如我之前所说,我对 C++ 不是很熟悉,但看起来我必须指定一个 const std::string
值。我试过这个:
const std::string s = "s";
std::random_device rd(s);
但它会导致同样的错误。如何避免?
我在 Windows 平台上使用 MinGW 4.7 32 位编译器和 Desktop Qt 5.0.1。我还在 .pro 文件中写了QMAKE_CXXFLAGS += -std=c++0x
。
【问题讨论】:
请在每次请求随机数时停止创建随机引擎。创建一个作为对象的成员并要求它提供一个新的随机数。 【参考方案1】:这是 MinGW 中的一个错误(在 this SO answer 中也有详细说明)。基本上,MinGW 没有 random_device
的特定于 Windows 的实现,因此它只是尝试打开 /dev/urandom
,失败并抛出 std::runtime_error
。
VS2012 的 std::random_device
可以正常工作,就像直接使用 mt19937
或其他生成器一样。
【讨论】:
感谢您的回复!我会尽量不使用 std::random_device。 似乎现在它可以编译但 allays 返回相同的数字。 ***.com/questions/18880654/… 什么是VS2012? 编辑: Visual Studio 2012,好的。好吧,我正在使用 Code::block,该死的……以上是关于带有“std::runtime_error”的 C++0x random_device的主要内容,如果未能解决你的问题,请参考以下文章
区别:std::runtime_error 与 std::exception()
误解 std::runtime_error 的 what() 函数