我需要PRNG不仅可以重复,而且还能够在两个方向上遍历它的内部状态。
E.g
r = prng_from_seed(seed)
r.next # => 0.12332132412
r.next # => 0.57842057177
r.next # => 0.74782915912
r.prev # => 0.57842057177
r.next # => 0.74782915912
哪种相对强大的PRNG算法具有此功能?
答案 0 :(得分:3)
RNG具有快速对数(log2(N))向前和向后跳跃(a.k.a.leap-frog)。它们基于F. Brown的论文,“任意步幅的随机数生成”,Trans。上午。核酸研究SOC。 (1994年11月)。
相对简单的一个用于着名的MC代码MCNP,Fortran和C ++实现https://github.com/Iwan-Zotow/LCG-PLE63,虽然它不会通过像Diehard这样的测试。
,PCG随机的一系列更复杂但质量更好答案 1 :(得分:2)
使用一个简单的计数器作为种子,用next增加,用prev减少。然后使用此计数器作为另一个用于生成随机数的随机生成器的种子。
答案 2 :(得分:2)
几乎所有PRNG都有此功能,但没有人实现过以前的状态方法。
考虑:
由于PRNG具有有限大小的状态,因此重复调用next()最终将进入您之前所处的状态。
如果你通过对next()进行N次调用,最终会再次到达状态,那么你总是可以通过对next()进行N-1次调用来找到一个前任状态。
当然,在现实生活中,您需要一种更有效的方式来实现prev()。怎么做取决于RNG,但通常不太难。
请注意,为了充分利用其状态,PRNG的设计周期尽可能大。通常所有可访问的状态都在同一个循环中。
编辑:
我应该补充一点,当人们想要在现实生活中这样做时,他们通常只使用计数器作为内部状态,并将其哈希(或用固定密钥加密)以生成每个随机数。在加密上下文中,这称为“CTR MODE”加密,可以转换。
当然,如果您这样做,那么您可以随机访问每个状态。