gpt4 book ai didi

c++ - 随机数发生器 : Should it be used as a singleton?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:59 25 4
gpt4 key购买 nike

我在几个地方使用随机数,并且通常在需要时构造一个随机数生成器。目前我使用 Marsaglia Xorshift 算法为它播种当前系统时间。现在我对这个策略有些疑惑:如果我使用多个生成器,则生成器之间数字的独立性(随机性)取决于种子(相同的种子相同的数字)。因为我使用时间 (ns) 作为种子并且因为这次改变了这个工作但是我想知道只使用一个单一的生成器是否会更好,例如使其作为单例可用。这会提高随机数质量吗?

编辑:不幸的是,c++11 还不是一个选项

编辑:更具体地说:我并不是说单例可以提高随机数质量,而是说只使用和播种一个生成器这一事实。否则我必须确保不同生成器的种子相互独立(随机)。极端例子:我用完全相同的数字给两个生成器播种 -> 它们之间没有随机性

最佳答案

假设您有几个变量,每个变量都需要是随机的,独立于其他变量,并且会定期重新分配一些随机生成器的新随机值。这种情况在蒙特卡洛分析和游戏中经常发生(尽管游戏的严谨性远低于蒙特卡洛)。如果存在一个完美的随机数生成器,那么使用它的单个实例就可以了。将来自生成器的第n个伪随机数分配给变量x1,下一个随机数分配给变量< em>x2x3 的下一个,依此类推,最终回到变量 x1 在下一个周期。大约。这里有一个问题:以这种方式使用时,有太多的 PRNG 无法通过独立性测试而无法通过独立性测试,有些甚至无法通过单个序列的随机性测试。

我的方法是使用单个 PRNG 生成器作为一组 N 自包含 PRNG 实例的种子生成器。后面这些 PRNG 的每个实例都提供一个变量。所谓自包含,是指 PRNG 是一个对象,状态在实例成员中维护,而不是在静态成员或全局变量中维护。种子生成器甚至不需要与其他 N 个 PRNG 来自同一家族。它只需要在多个线程同时尝试使用种子生成器的情况下是可重入的。但是,在我的使用中,我发现最好在线程开始之前设置 PRNG,以保证可重复性。那是一次运行,一次执行。蒙特卡洛技术通常需要执行数千次,也许更多,也许更多。对于 Monte Carlo,可重复性至关重要。所以还需要另一个随机种子生成器。这个种子生成器用于为变量生成 N 个生成器。

可重复性很重要,至少在蒙特卡洛世界中是如此。假设长时间的 Monte Carlo 模拟的第 10234 次运行导致了一些严重的失败。很高兴看到世界上发生了什么。这可能是统计上的侥幸,也可能是个问题。问题是在典型的 MC 设置中,只记录了最低限度的数据,刚好足以计算统计数据。要查看运行编号 10234 中发生的情况,需要重复该特定情况,但现在记录所有内容。

关于c++ - 随机数发生器 : Should it be used as a singleton?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12778092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com