我在这里阅读了有关FoundationDB如何进行网络测试/模拟的信息:http://www.slideshare.net/FoundationDB/deterministic-simulation-testing
我想实现一些非常相似的东西,但无法弄清楚它们是如何实现它的。如何编写,例如,一个C ++类来完成他们的工作。是否有可能在不进行任何代码生成的情况下进行这种模拟(如他们所假设的那样)?
另外:如果模拟包含随机事件,如何重复模拟?每次模拟都需要选择一个新的随机值,因此与之前的运行不一样。也许我在这里错过了一些东西......希望有人能对这件事有所了解。
答案 0 :(得分:3)
您可以在此处的演讲中找到更多详细信息:https://www.youtube.com/watch?v=4fFDFbi3toc
至于确定性问题,你是正确的,除非仔细控制所有可能的随机性和其他非确定性来源,否则模拟不能完全重复。为此:
(1)从您使用已知值播种的PRNG生成所有随机数。
(2)根据您无法控制的世界事实(例如,一天中的时间,机器上的负载等),或者如果您无法帮助,避免任何类型的分支或条件,然后伪随机模拟那些东西。
(3)确保您选择的并发机制具有可以保证确定性执行顺序的模式。
由于很容易搞砸所有这些事情,你还想要一种检查确定性是否被违反的方法。
我在上面的链接中详细介绍了所有这些内容。
答案 1 :(得分:0)
在sims中我构建了重复性最大的问题,最终是正确的种子管理(根据之前的答案)。只有当您为随机数生成器提供不同的种子时,您才希望模拟能够提供不同的结果。
在此之后,我所看到的最大问题似乎是确保您不会使用非确定性排序迭代集合。例如,在Java中,您使用的是LinkedHashMap而不是HashMap。