Mar*_*tin 5 c++ random design-patterns c++03
我在几个地方使用随机数,并且通常在需要时构建一个随机数生成器。目前,我使用 Marsaglia Xorshift 算法将当前系统时间作为种子。现在我对这个策略有一些疑问:如果我使用多个生成器,生成器之间的数字的独立性(随机性)取决于种子(相同的种子相同的数字)。由于我使用时间(ns)作为种子,并且由于这次改变了这个工作,但我想知道仅使用一个单一生成器是否会更好,例如使其可用作单例。这会提高随机数质量吗?
编辑:不幸的是 c++11 还不是一个选项
编辑:更具体地说:我并不是建议单例可以提高随机数质量,而是仅使用一个生成器并播种这一事实。否则,我必须确保不同生成器的种子彼此独立(随机)。极端的例子:我用完全相同的数字播种两个生成器 - >它们之间没有随机性
假设您有多个变量,每个变量都需要是随机的,独立于其他变量,并且将定期使用来自某个随机生成器的新随机值重新分配。这种情况在蒙特卡罗分析和游戏中经常发生(尽管游戏的严格性远低于蒙特卡罗)。如果存在完美的随机数生成器,那么使用它的单个实例就可以了。将生成器中的第 n个伪随机数分配给变量x 1,将下一个随机数分配给变量x 2,下一个随机数分配给变量x 3 ,依此类推,最终在下一个周期返回变量x 1 。大约。这里有一个问题:太多的 PRNG 在以这种方式使用时无法通过独立性测试,有些甚至无法通过单个序列的随机性测试。
我的方法是使用单个 PRNG 生成器作为一组N 个独立 PRNG 实例的种子生成器。后面这些 PRNG 的每个实例都提供一个变量。通过自包含,我的意思是 PRNG 是一个对象,其状态保存在实例成员中,而不是静态成员或全局变量中。种子生成器甚至不需要与其他N个PRNG 属于同一系列。在多个线程同时尝试使用种子生成器的情况下,它只需要是可重入的。然而,在我的使用中,我发现最好在线程开始之前设置 PRNG,以保证可重复性。这是一次运行,一次执行。蒙特卡罗技术通常需要数千次执行,也许更多,也许更多。对于蒙特卡罗,可重复性至关重要。因此还需要另一个随机种子生成器。这个种子生成器用于生成变量的N个生成器。
可重复性很重要,至少在蒙特卡洛世界中是这样。假设长时间蒙特卡洛模拟的运行编号 10234 导致了一些大规模故障。很高兴看到世界上发生了什么。这可能是统计上的侥幸,也可能是一个问题。问题在于,在典型的 MC 设置中,仅记录最少的数据,仅足以用于计算统计数据。要查看运行编号 10234 中发生的情况,需要重复该特定情况,但现在记录所有内容。