我在这里读到FoundationDB如何进行网络测试/模拟:http://www.slideshare.net/FoundationDB/deterministic-simulation-testing
我想实现一些非常相似的东西,但不知道他们实际上是如何实现的。例如,如何编写一个c++类来完成它们的工作呢?是否有可能在不做任何代码生成的情况下进行模拟(就像他们所做的那样)?
还有:如果一个模拟包含随机事件,它怎么能被重复??每次模拟都需要选择一个新的随机值,因此与之前的运行不同。也许我在这里遗漏了什么……
你可以在这些幻灯片附带的演讲中找到更多细节:https://www.youtube.com/watch?v=4fFDFbi3toc
至于决定论的问题,你是对的,除非仔细控制所有可能的随机性和其他非决定论来源,否则模拟不能精确地重复。To the end:
(1)从一个已知值的PRNG中生成所有随机数。
(2)避免基于你无法控制的世界事实的任何分支或条件(例如,一天中的时间,机器上的负载等),或者如果你无法控制,那么也可以伪随机地模拟这些事情。
(3)无论你为并发选择什么机制,都要确保它有一种模式,在这种模式下,它可以保证一个确定性的执行顺序。
由于很容易把所有这些事情搞砸,您还需要有一种方法来检查是否违反了决定论。
所有这些都在我上面链接的演讲中有更详细的介绍。
在模拟人生中,可重复性的最大问题是正确的种子管理(根据之前的答案)。只有当你向随机数生成器提供与以前不同的种子时,你才希望你的模拟得到不同的结果。
在那之后,我看到的最大的问题似乎是确保你不迭代不确定排序的集合。例如,在Java中,您将使用LinkedHashMap而不是HashMap。