【问题标题】:How to implement deterministic single threaded network simulation如何实现确定性单线程网络仿真
【发布时间】:2015-10-26 08:02:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: simulation deterministic foundationdb


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • HashMap 不是随机的。即使是这样,你也可以控制种子。所以可能没有指定迭代顺序,但是如果你使用相同的 HashMap 实现和相同的输入,你总是会得到相同的结果。
      • 非确定性与随机性不同。在 Java 中,hashCode() 方法用于确定 HashMaps 的迭代顺序,但 hashCode() 方法的约定并不要求每次运行程序时使用相同的值。事实上,hashCode() 的默认实现通常取决于对象的内存位置。因此,如果您想要可重复的结果,一个好的一般规则是在迭代哈希映射时不要依赖存储桶成员。
      • 好吧,如果你使用带有“非值”对象作为键的HashMap,那么这确实是个问题。我将其归入另一个答案中提出的“避免任何基于您无法控制的世界的事实的分支或条件”项下。但是,您用于哈希键(例如字符串或整数)的任何“正常”对象,其 hashCode 的“值”是稳定的,不会有这个问题。然后行为是完全确定的。 stackoverflow.com/questions/9440380/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2021-07-23
      • 2020-06-01
      • 2012-04-02
      • 2010-10-15
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多