【发布时间】:2015-09-12 02:08:35
【问题描述】:
我有一个类似 monte-carlo 的系统,其中我有一些状态随机演变,使用内部随机数生成器。我还在程序的其他地方存储了这个状态的const 副本,因为我想知道它会如何演变,如果它真的演变。这需要随机数生成器的两件事:
1) 能够在不修改生成器的情况下克隆生成器,以存储状态的复制版本。
2) 能够从生成器的const 副本中确定下一个随机数。
这可能只使用标准库吗?如果没有,你能推荐一个第三方库吗?
【问题讨论】:
我有一个类似 monte-carlo 的系统,其中我有一些状态随机演变,使用内部随机数生成器。我还在程序的其他地方存储了这个状态的const 副本,因为我想知道它会如何演变,如果它真的演变。这需要随机数生成器的两件事:
1) 能够在不修改生成器的情况下克隆生成器,以存储状态的复制版本。
2) 能够从生成器的const 副本中确定下一个随机数。
这可能只使用标准库吗?如果没有,你能推荐一个第三方库吗?
【问题讨论】:
标准C++11 random generators是可以复制的普通对象,复制会产生相同的序列。他们还可以使用operator<< 和operator>> 将其内部状态序列化和反序列化为iostream。
生成随机数的operator() 不是const 函数,因为它改变了生成器的内部状态。所以你不能直接在生成器的const 副本上调用它。但是您可以制作一个 const 的临时可变副本,从中生成一个值,然后将其销毁。
如果您的编译器不支持 C++11,您可以使用 Boost.Random library,这是标准编译器的基础。
【讨论】:
std::random_device 除外,它可以是伪 RNG 或真正的随机设备,例如在现代 CPU 上随机使用量子效应。使用这种不确定的 RNG,复制的顺序可能会有所不同。