【问题标题】:Using c++ random number generators in a pure fashion以纯粹的方式使用 C++ 随机数生成器
【发布时间】:2015-09-12 02:08:35
【问题描述】:

我有一个类似 monte-carlo 的系统,其中我有一些状态随机演变,使用内部随机数生成器。我还在程序的其他地方存储了这个状态的const 副本,因为我想知道它会如何演变,如果它真的演变。这需要随机数生成器的两件事:

1) 能够在不修改生成器的情况下克隆生成器,以存储状态的复制版本。

2) 能够从生成器的const 副本中确定下一个随机数。

这可能只使用标准库吗?如果没有,你能推荐一个第三方库吗?

【问题讨论】:

    标签: c++ random std


    【解决方案1】:

    标准C++11 random generators是可以复制的普通对象,复制会产生相同的序列。他们还可以使用operator<<operator>> 将其内部状态序列化和反序列化为iostream。

    生成随机数的operator() 不是const 函数,因为它改变了生成器的内部状态。所以你不能直接在生成器的const 副本上调用它。但是您可以制作一个 const 的临时可变副本,从中生成一个值,然后将其销毁。

    如果您的编译器不支持 C++11,您可以使用 Boost.Random library,这是标准编译器的基础。

    【讨论】:

    • std::random_device 除外,它可以是伪 RNG 或真正的随机设备,例如在现代 CPU 上随机使用量子效应。使用这种不确定的 RNG,复制的顺序可能会有所不同。
    • @Calvin,好吧,该类是不可复制的,因此在编译时很快就会清楚您无法制作确定性副本。但是,是的,我应该提到它作为一个警告。
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多