随机数生成器的种子和状态之间有什么区别?

时间:2017-08-17 19:41:52

标签: c++ random

我看到一个C ++程序接受种子和状态来设置info =,这是special_string = str('info %d info = more_stuff' %variable3) 的typedef(至少在我的系统上)。 std::default_random_engine方法用于设置初始种子和状态std::linear_congruential_engine

我知道播种随机数发生器(RNG)的原理,但是它可以与其状态互换使用。

4 个答案:

答案 0 :(得分:6)

种子是用于初始化生成器的值,状态是每次调用后生成随机数的生成器的当前状态。对于非常简单的随机数生成器,例如线性同余生成器,种子和状态是相同的(或者至少存储在同一个变量中),但它们当然不必存在。

答案 1 :(得分:2)

如果你(重新)种子PRNG,从而(重新)初始化它,你用一个新的,它是种子的(可能是微不足道的)函数替换它的当前状态。为了减轻输入中的模式,这个初始函数通常在所有状态下分配熵更复杂。

使用operator>>恢复内部状态会使用这样一个简单的映射。

无论哪种(重新)播种都是有效的,剩下的就是浪费精力。

答案 2 :(得分:1)

免责声明:我不是关于随机数生成器理论方面的专家,下面的大部分内容实际上来自C ++标准本身。

生成器的状态 X i ,是生成器的实际内部状态 - 您需要生成的(最小)信息下一个状态和生成器的下一个值:

  • 使用“过渡”功能从一种状态转换到另一种状态, X i + 1 = TA(X i ; < / LI>
  • 使用“生成”功能 GA(X i 生成值。

种子 S 是用于生成第一个州 X 0 的“值”。

生成器的状态是它固有的(见下文),同一个生成器的两个实现将具有相同的状态(在理论意义上),但可能需要完全不同的种子。 / p>

在C ++中,你使用单个值来播种Mersenne Twister引擎,而它的状态是一个整数序列......我可以选择实现一个只能通过整数序列生成的Mersenne Twister引擎(成为第一个州。)

标准随机库中的一些例子可以更好地理解:

线性同余生成器只是一个遵循表单递归关系的生成器:

  

X i + 1 = TA(X i )=(a。X i + c)mod m

acm是生成器的参数。在这种情况下:

  • 引擎的状态只是 X i 的当前值;
  • 种子是 X 0 的值;

...当您使用值 k 为种子生成种子时,实际上只需设置 X i = k

但还有其他发电机,例如在C ++ 11标准随机库中,您将找到Mersenne Twister(MT)生成器。

我当然不是Mersenne Twister发电机的专家,但是从c++ draft,您可以看到:

  • MT生成器的状态实际上是整数序列 X i =(X i,0 ,X i,1 ,...);
  • MT(在标准中)的种子实际上是单个值;

...当您使用值 k 为种子生成种子时,实际执行“复杂”操作 1 来计算 X 0 k 的sub> ,但 X 0 当然不是 k

1 我不会详细介绍这些操作,因为我真的不知道它们,但是你可以查看standard以查看状态(序列) )是从种子生成的。

答案 3 :(得分:0)

通常,种子值用于生成随机数。通常出于性能原因,种子值用于生成一组数字,然后将其添加到数组或内存表中。进一步调用获取随机数只是从表中读取预先生成的值。表中的当前索引和表中的当前值集可以视为状态。当使用可以利用大量随机数调用的复杂系统时(例如游戏引擎),调试(再现错误)变得非常困难,除非您可以重现“随机”事件。如果保存然后恢复“状态”和种子值,则可以确保在代码运行时,每次都会选择相同的“随机”数字。我确信这只是众多可能答案中的一个,但希望有所帮助。