1

我在这里了解了 FoundationDB 如何进行网络测试/模拟:http ://www.slideshare.net/FoundationDB/deterministic-simulation-testing

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

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

4

2 回答 2

3

您可以在此处与这些幻灯片一起进行的演讲中找到更多详细信息:https ://www.youtube.com/watch?v=4fFDFbi3toc

至于确定性问题,你是对的,除非所有可能的随机性和其他非确定性来源都得到仔细控制,否则模拟不能完全重复。为此:

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

(2) 避免基于您无法控制的世界事实(例如一天中的时间、机器上的负载等)的任何类型的分支或条件,或者如果您无能为力,则使用伪- 也随机模拟那些东西。

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

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

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

于 2015-11-20T05:52:58.397 回答
0

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

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

于 2015-11-20T21:40:03.503 回答