如何实现确定性单线程网络模拟

How to implement deterministic single threaded network simulation

我在此处阅读了有关 FoundationDB 如何构建其网络 testing/simulation 的信息:http://www.slideshare.net/FoundationDB/deterministic-simulation-testing

我想实现一些非常相似的东西,但无法弄清楚他们实际上是如何实现的。例如,一个人将如何编写一个 C++ class 来完成他们所做的事情。是否可以在不生成任何代码的情况下进行他们所做的那种模拟(正如他们推测的那样)?

另外:如果模拟包含随机事件,如何重复模拟?每次模拟都需要选择一个新的随机值,因此与之前的 运行 不同。也许我在这里遗漏了一些东西...希望有人能对此事有所了解。

您可以在此处的幻灯片附带的谈话中找到更多详细信息:https://www.youtube.com/watch?v=4fFDFbi3toc

至于确定性问题,你是对的,除非仔细控制所有可能的随机源和其他非确定性,否则无法精确重复模拟。为此:

(1) 从您使用已知值播种的 PRNG 生成所有随机数。

(2) 避免基于你无法控制的世界事实(例如一天中的时间、机器上的负载等)或你无法控制的任何类型的分支或条件帮助那个,然后伪随机模拟那些东西。

(3) 确保您为并发选择的任何机制都具有可以保证确定性执行顺序的模式。

由于很容易将所有这些事情搞砸,您还需要一种方法来检查是否违反了确定性。

所有这些在我上面链接的演讲中都有更详细的介绍。

在我建立的模拟人生中,可重复性的最大问题最终是适当的种子管理(根据之前的回答)。仅当您向随机数生成器提供与以前不同的种子时,您才希望模拟给出不同的结果。

在那之后,我看到的最大问题似乎往往是确保您不会迭代具有不确定顺序的集合。例如,在 Java 中,您将使用 LinkedHashMap 而不是 HashMap。