【问题标题】:How to generate random 64 bit ints with boost random如何使用 boost random 生成随机 64 位整数
【发布时间】:2010-08-16 13:08:15
【问题描述】:

我正在尝试使用 boost random 生成一个随机的 64 位无符号整数, 但是我遇到了uniform_int的断言失败。

struct timeval tv;
boost::mt19937 randGen(tval.tv_usec);
boost::uniform_int<> uInt64Dist(0, std::numeric_limits<uint64_t>::max());
boost::variate_generator<boost::mt19937&, boost::uniform_int<> > getRand(randGen, uInt64Dist);
uint64_t clock_seq_= getRand();

这是第 3 行的输出。

main:/usr/include/boost/random/uniform_int.hpp:48: boost::uniform_int<IntType>::uniform_int(IntType, IntType) [with IntType = int]: Assertion `min_arg <= max_arg' failed.

编辑:根据您的回答,我尝试使用以下指定尺寸:

boost:uniform_int<uint64_t> ....

但我得到以下编译错误:

spec.cpp: In member function ‘void Specifier::initialize()’:
spec.cpp:58: error: no matching function for call to ‘boost::variate_generator<boost::mt19937&, boost::uniform_int<int> >::variate_generator(boost::mt19937&, boost::uniform_int<long unsigned int>&)’
/usr/include/boost/random/variate_generator.hpp:97: note: candidates are: boost::variate_generator<Engine, Distribution>::variate_generator(Engine, Distribution) [with Engine = boost::mt19937&, Distribution = boost::uniform_int<int>]
/usr/include/boost/random/variate_generator.hpp:87: note:                 boost::variate_generator<boost::mt19937&, boost::uniform_int<int> >::variate_generator(const boost::variate_generator<boost::mt19937&, boost::uniform_int<int> >&)
make: *** [spec.o] Error 1

编辑:好的,错过了 boost::uniform_int 的第二个实例。一旦我得到了它们,一切就都过去了。

【问题讨论】:

    标签: c++ boost boost-random


    【解决方案1】:

    uniform_int 默认为 int 作为值类型。请改用以下内容:

    boost::uniform_int<uint64_t> ...
    

    以下行也是如此:

    boost::variate_generator<boost::mt19937&, boost::uniform_int<uint64_t> > ...
    

    【讨论】:

    • 对,线索在错误信息中:[with IntType = int]
    • uint64_t 可以在&lt;boost/cstdint.hpp&gt; 中找到。
    • 听起来很有希望,但它现在无法编译。请参阅我更新的问题。
    • @Matt:好像你忘了更改boost::uniform_int 的第二个实例,就像答案提醒的那样。 :) (或者我错了。)typedef 在这里会很有帮助,所以你只需要在一个地方改变它。
    【解决方案2】:

    您需要在boost::uniform_int&lt;&gt; 的声明中指定您使用的是 64 位整数类型。否则defaults 为 32 位类型。

    【讨论】:

    • 这听起来很有希望,但它现在无法编译。查看更新的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    相关资源
    最近更新 更多