我看到一个C ++程序接受种子和状态来设置info =
,这是special_string = str('info %d info = more_stuff' %variable3)
的typedef(至少在我的系统上)。
std::default_random_engine
方法用于设置初始种子和状态std::linear_congruential_engine
。
我知道播种随机数发生器(RNG)的原理,但是它可以与其状态互换使用。
答案 0 :(得分:6)
种子是用于初始化生成器的值,状态是每次调用后生成随机数的生成器的当前状态。对于非常简单的随机数生成器,例如线性同余生成器,种子和状态是相同的(或者至少存储在同一个变量中),但它们当然不必存在。
答案 1 :(得分:2)
如果你(重新)种子PRNG,从而(重新)初始化它,你用一个新的,它是种子的(可能是微不足道的)函数替换它的当前状态。为了减轻输入中的模式,这个初始函数通常在所有状态下分配熵更复杂。
使用operator>>
恢复内部状态会使用这样一个简单的映射。
无论哪种(重新)播种都是有效的,剩下的就是浪费精力。
答案 2 :(得分:1)
免责声明:我不是关于随机数生成器理论方面的专家,下面的大部分内容实际上来自C ++标准本身。
生成器的状态 X i ,是生成器的实际内部状态 - 您需要生成的(最小)信息下一个状态和生成器的下一个值:
种子 S 是用于生成第一个州 X 0 的“值”。
生成器的状态是它固有的(见下文),同一个生成器的两个实现将具有相同的状态(在理论意义上),但可能需要完全不同的种子。 / p>
在C ++中,你使用单个值来播种Mersenne Twister引擎,而它的状态是一个整数序列......我可以选择实现一个只能通过整数序列生成的Mersenne Twister引擎(成为第一个州。)
标准随机库中的一些例子可以更好地理解:
线性同余生成器只是一个遵循表单递归关系的生成器:
X i + 1 = TA(X i )=(a。X i + c)mod m 强>
a
,c
和m
是生成器的参数。在这种情况下:
...当您使用值 k 为种子生成种子时,实际上只需设置 X i = k 。
但还有其他发电机,例如在C ++ 11标准随机库中,您将找到Mersenne Twister(MT)生成器。
我当然不是Mersenne Twister发电机的专家,但是从c++ draft,您可以看到:
...当您使用值 k 为种子生成种子时,实际执行“复杂”操作 1 来计算 X 0 来自 k 的sub> ,但 X 0 当然不是 k 。
1 我不会详细介绍这些操作,因为我真的不知道它们,但是你可以查看standard以查看状态(序列) )是从种子生成的。
答案 3 :(得分:0)
通常,种子值用于生成随机数。通常出于性能原因,种子值用于生成一组数字,然后将其添加到数组或内存表中。进一步调用获取随机数只是从表中读取预先生成的值。表中的当前索引和表中的当前值集可以视为状态。当使用可以利用大量随机数调用的复杂系统时(例如游戏引擎),调试(再现错误)变得非常困难,除非您可以重现“随机”事件。如果保存然后恢复“状态”和种子值,则可以确保在代码运行时,每次都会选择相同的“随机”数字。我确信这只是众多可能答案中的一个,但希望有所帮助。