【问题标题】:If I use the same seed on every platform, will the random results be the same?如果我在每个平台上使用相同的种子,随机结果会相同吗?
【发布时间】:2018-11-26 06:24:40
【问题描述】:

在一场关于网络游戏的辩论中,一位用户建议对客户端和服务器对象使用相同的随机种子,这样即使敌人在服务器上随机移动,客户端也会以相同的方式移动。

起初我想争辩说,相同的种子并不能保证每个平台上的随机结果都是一致的;并且这种网络方法将非常幼稚。但对种子的了解不够,我无法确定。

为了论证,假设我们使用 C++ 编码并使用标准的 rand() 和 srand() 函数。

【问题讨论】:

  • 如果你使用Mersenne Twister,每次都是一样的。
  • 这仅(可能)在客户端和服务器使用相同的 RNG 算法时有效。 C++ 标准当然不能保证rand() 会这样做。
  • @wally:从文档来看,尚不清楚情况是否如此。 “基于”,以及奇怪的注释:“需要第 10000 次连续调用默认构造的 std::mt19937 才能产生值 4123659995”
  • 正如 wally 所提到的,这适用于 <random> 标头中的特定 RNG。请注意,尽管分布以相同的方式工作,并且是实现定义的。因此,您需要定义自己的发行版。
  • @Jarod42 谈了in this video

标签: c++ random seed


【解决方案1】:

对于rand,没有这样的保证。

对于 <random> 标头,但情况有所不同。

cppreference 上声明

所有引擎都可以被专门播种、序列化和反序列化,以便与可重复的模拟器一起使用。

您可以使用operator>>operator<< 序列化和反序列化引擎的状态,并通过网络发送此状态,并保证在不同平台上的可重现性。这是标准规定的。

  • std::default_random_engine 可以使用引擎盖下的任何引擎,因此没有这样的保证。

  • 分发是由实现定义的,您需要自己定义以保证可重复性。

奖金video link 包含更多关于<random> 标头的详细信息。

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 2018-07-21
    • 2016-09-16
    • 1970-01-01
    • 2018-05-20
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多