如果我在每个平台上使用相同的种子,随机结果会相同吗?
If I use the same seed on every platform, will the random results be the same?
在一场关于网络游戏的辩论中,一位用户建议对客户端和服务器对象使用相同的随机种子,这样即使敌人在服务器上随机移动,客户端也会以相同的方式移动。
起初我想争辩说,相同的种子并不能保证在每个平台上都有一致的随机结果;而且这种网络方法将非常天真。但对种子的了解不够,我无法确定。
为了论证,假设我们用 C++ 编码并使用标准的 rand() 和 srand() 函数。
rand
没有这样的保证。
对于 <random>
header 但是情况有所不同。
在 cppreference 上说
All of the engines may be specifically seeded, serialized, and deserialized for use with repeatable simulators.
您可以使用 operator>>
和 operator<<
序列化和反序列化引擎的状态,并通过网络发送此状态,并保证在不同平台上的可重现性。这是标准规定的。
std::default_random_engine
可以使用引擎盖下的任何引擎,因此没有这样的保证。
分布是实现定义的,您需要定义自己的分布以保证可再现性。
奖金 video link 关于 <random>
header.
的更多详细信息
在一场关于网络游戏的辩论中,一位用户建议对客户端和服务器对象使用相同的随机种子,这样即使敌人在服务器上随机移动,客户端也会以相同的方式移动。
起初我想争辩说,相同的种子并不能保证在每个平台上都有一致的随机结果;而且这种网络方法将非常天真。但对种子的了解不够,我无法确定。
为了论证,假设我们用 C++ 编码并使用标准的 rand() 和 srand() 函数。
rand
没有这样的保证。
对于 <random>
header 但是情况有所不同。
在 cppreference 上说
All of the engines may be specifically seeded, serialized, and deserialized for use with repeatable simulators.
您可以使用 operator>>
和 operator<<
序列化和反序列化引擎的状态,并通过网络发送此状态,并保证在不同平台上的可重现性。这是标准规定的。
std::default_random_engine
可以使用引擎盖下的任何引擎,因此没有这样的保证。分布是实现定义的,您需要定义自己的分布以保证可再现性。
奖金 video link 关于 <random>
header.