我在几个地方使用随机数,并且通常在需要时构建一个随机数生成器。目前,我使用 Marsaglia Xorshift 算法将当前系统时间作为种子。
现在我对这个策略有一些疑问:
如果我使用多个生成器,生成器之间的数字的独立性(随机性)取决于种子(相同的种子相同的数字)。由于我使用时间(ns)作为种子,并且由于这次改变了这个工作,但我想知道仅使用一个单一生成器是否会更好,例如使其作为单例可用。这会提高随机数质量吗?
编辑:不幸的是 c++11 还不是一个选项
编辑:更具体地说:我并不是建议单例可以提高随机数质量,而是仅使用一个生成器并播种这一事实。否则,我必须确保不同生成器的种子彼此独立(随机)。
极端的例子:我用完全相同的数字播种两个生成器 - >它们之间没有随机性
Suppose you have several variables, each of which needs to be random, independent from the others, and will be regularly reassigned with a new random value from some random generator. This happens quite often with Monte Carlo analysis, and games (although the rigor for games is much less than it is for Monte Carlo). If a perfect random number generator existed, it would be fine to use a single instantiation of it. Assign the nth pseudo random number from the generator to variable x1, the next random number to variable x2, the next to x3, and so on, eventually coming back to variable x1 on the next cycle. around. There's a problem here: Far too many PRNGs fail the independence test fail the independence test when used this way, some even fail randomness tests on individual sequences.
我的方法是使用单个 PRNG 生成器作为一组的种子生成器N独立 PRNG 的实例。后面这些 PRNG 的每个实例都提供一个变量。通过自包含,我的意思是 PRNG 是一个对象,其状态保存在实例成员中,而不是静态成员或全局变量中。种子生成器甚至不需要与其他生成器来自同一家族NPRNG。在多个线程同时尝试使用种子生成器的情况下,它只需要是可重入的。然而,在我的使用中,我发现最好在线程开始之前设置 PRNG,以保证可重复性。这是一次运行,一次执行。蒙特卡罗技术通常需要数千次执行,也许更多,也许更多。对于蒙特卡罗,可重复性至关重要。因此还需要另一个随机种子生成器。这一个种子生成器用于生成N变量的生成器。
可重复性很重要,至少在蒙特卡洛世界中是这样。假设长时间蒙特卡洛模拟的运行编号 10234 导致了一些大规模故障。很高兴看到世界上发生了什么。这可能是统计上的侥幸,也可能是一个问题。问题在于,在典型的 MC 设置中,仅记录最少的数据,仅足以用于计算统计数据。要查看运行编号 10234 中发生的情况,需要重复该特定情况,但现在记录所有内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)