双向随机数发生器

时间:2015-11-21 14:44:36

标签: algorithm random

我需要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算法具有此功能?

3 个答案:

答案 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这样的测试。

http://www.pcg-random.org/

,PCG随机的一系列更复杂但质量更好

答案 1 :(得分:2)

使用一个简单的计数器作为种子,用next增加,用prev减少。然后使用此计数器作为另一个用于生成随机数的随机生成器的种子。

答案 2 :(得分:2)

几乎所有PRNG都有此功能,但没有人实现过以前的状态方法。

考虑:

  • 由于PRNG具有有限大小的状态,因此重复调用next()最终将进入您之前所处的状态。

  • 如果你通过对next()进行N次调用,最终会再次到达状态,那么你总是可以通过对next()进行N-1次调用来找到一个前任状态。

当然,在现实生活中,您需要一种更有效的方式来实现prev()。怎么做取决于RNG,但通常不太难。

请注意,为了充分利用其状态,PRNG的设计周期尽可能大。通常所有可访问的状态都在同一个循环中。

编辑:

我应该补充一点,当人们想要在现实生活中这样做时,他们通常只使用计数器作为内部状态,并将其哈希(或用固定密钥加密)以生成每个随机数。在加密上下文中,这称为“CTR MODE”加密,可以转换。

当然,如果您这样做,那么您可以随机访问每个状态。