c – 随机数发生器:它应该用作单身吗?

我在几个地方使用随机数,并且通常在需要时构造随机数生成器.目前我使用Marsaglia Xorshift算法将其与当前系统时间一起播种.

现在我对这个策略有些怀疑:

如果我使用几个生成器,则生成器之间的数字的独立性(随机性)取决于种子(相同的种子相同的数字).因为我使用时间(ns)作为种子,并且因为这个时间改变了,但是我想知道仅使用一个奇异发生器并且例如是否更好.使其成为单身人士.这会增加随机数质量吗?

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

编辑:更具体一点:我并不是说单身人士可以提高随机数质量,而是只使用一个发电机并播种.否则,我必须确保不同发电机的种子是独立的(随机的).
极端的例子:我种下两个具有完全相同数字的发电机 – >他们之间没有随机性

最佳答案 假设你有几个变量,每个变量需要是随机的,独立于其他变量,并且会定期用一些随机生成器中的新随机值重新分配.这种情况经常发生在蒙特卡洛分析和游戏中(尽管游戏的严谨程度远低于蒙特卡洛).如果存在完美的随机数生成器,则可以使用它的单个实例化.将第n个伪随机数从生成器分配给变量x1,将下一个随机数分配给变量x2,将下一个随机数分配给x3,依此类推,最终在下一个循环中返回变量x1.周围.这里存在一个问题:当使用这种方式时,太多的PRNG未通过独立性测试失败独立性测试,有些甚至对单个序列进行随机性测试失败.

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

重复性很重要,至少在蒙特卡洛世界中如此.假设长蒙特卡罗模拟的运行编号10234导致一些大的故障.很高兴看到世界上发生了什么.这可能是一个统计侥幸,它可能是一个问题.问题在于,在典型的MC设置中,仅记录最少的数据,足以用于计算统计数据.要查看运行编号10234中发生的情况,需要重复该特定情况,但现在记录所有内容.

点赞