【问题标题】:How can I get two programs to have the same sequence of random numbers?如何让两个程序具有相同的随机数序列?
【发布时间】:2017-01-25 17:47:26
【问题描述】:

两个应用程序(服务器和客户端)是否可以生成相同的随机数序列?我需要的是这个:

在服务器上:

i1:=randomrange(10,50); //i1 will be 15
i2:=randomrange(10,50); //i2 will be 40
i3:=randomrange(10,50); //i3 will be 20

在客户端:

i1:=randomrange(10,50); //i1 will be 15
i2:=randomrange(10,50); //i2 will be 40
i3:=randomrange(10,50); //i3 will be 20

序列需要依赖于服务器计算并发送给客户端的值

【问题讨论】:

  • 如果你在服务器端和客户端使用相同的随机数生成器,并用相同的种子初始化生成器,你应该得到相同的“随机”数列。

标签: delphi random numbers


【解决方案1】:

实际上,随机数生成器通常是伪随机的。给定相同的初始状态,伪随机数生成器 (PRNG) 将生成相同的数字序列。

通常通过种子提供状态。如果您使用 RTL 提供的 PRNG,那么您可以通过将值分配给 RandSeed 来设置种子。在每个程序中使用相同的种子,您将生成相同的值。

如果您使用不同的 PRNG,请查阅其文档以了解如何播种它。

【讨论】:

  • 大卫是对的,但他假设一个非加密 PRNG。如果您想要相同的随机数,请避免使用加密 PRNG,它们的设计目的是即使使用相同的种子也不提供相同的随机数——它们采用其他系统变量以及任何提供的种子来初始化 RNG。
  • @rossum 正如大卫所说,如果 PRNG 具有相同的初始状态,它会生成相同的序列。如果生成的序列不是 100% 由初始状态定义的,那么它不是 PRND。任何 PRND 都是如此,包括加密的。
  • 加密 PRNG 确实有一个初始状态。只是初始状态没有完全由用户定义。除了使用提供的种子之外,它们还使用各种内部系统级熵源,至少在理论上,攻击者难以确定这些源。初始状态存在,但不完全由用户确定。因此,没有两个实例可以可靠地设置为相同的初始状态。
【解决方案2】:

如果你想自己实现一个伪随机序列,你可以从线性同余生成器开始。其实很简单

acm只有3个限制价值观

  1. mc 是互质的,
  2. a-1 能被 m 的所有素因数整除
  3. 如果 m 能被 4 整除,a-1 能被 4 整除

有关详细信息,请参阅Linear congruential generator wiki。

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 2012-11-02
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2010-11-13
    • 2011-07-15
    相关资源
    最近更新 更多