【发布时间】:2014-05-08 17:18:01
【问题描述】:
我已经实现了一个 C++ 解决方案,用于测试针对一系列随机事件的各种策略。我正在汇总在几台计算机上运行的多线程模拟的结果。
单个模拟会产生一个整数结果,通常需要生成大约 100 个均匀随机整数,并且在保存一大块聚合数据(平均值、标准差、最小值、最大值)之前重复 1,000,000 次。尽管这些块的结果在给定架构上最多 6 位有效数字是一致的,但运行完全相同的程序的两台计算机之间的差异要大几个数量级。
到目前为止,我在两台配备 Intel 处理器和一个 AWS c3.8xlarge Windows Server 实例的个人 Windows 笔记本上运行了该程序(相同的可执行文件)。在每台计算机上,正在进行的模拟迅速接近不同的值。均值之间的相对差异约为 10^-3。在单台计算机上,100 万个块之间均值的相对差异很少超过 10^-6。
程序使用来自<random> 的mt19937 随机数生成器。我使用time(NULL) 播种。
我想不出这种不一致的原因。 Mersenne Twister 被认为是 Monte Carlo 模拟的声音发生器,我多次使用它,通常能够分析验证结果。由于生成器的缺陷和底层架构,我可以理解细微的差异和对一致性的偏离,但是对于这样的数量级,很难理解。
【问题讨论】:
-
不知道您是如何使用随机性的,也不知道您如何准确地测量差异(10e-3 数字是相对的还是绝对的?)我们只能猜测。您是否尝试保存在一台机器上使用的种子,并尝试在另一台机器上复制它?会不会是你的笔记本上有 directx 调用改变了你背后的浮点标志?您是在程序启动时只为 PRNG 播种一次,还是多次播种?
-
让我感到困惑,为什么您将这个 C++ 问题标记为 c
-
我提供了相对差异。我只播种一次 PRNG。
-
抱歉打错了标签。
-
@alethus 你能用更新编辑问题吗?使用最简单的情况:固定(相同)种子和单线程。对于下一次调查,确定您的模拟在哪里出现分歧。第一个分歧点。我会担心使用 80 位浮点寄存器或其他东西:分歧可能真的很早,我们可以从中得到 sscce.org
标签: c++ random simulation probability