伪随机序列生成器不仅仅是一个数字生成器

时间:2009-11-07 04:35:14

标签: integer random sequence prng

我需要一个算法,它几乎会将一个unix时间戳变成一个合适的随机数,所以如果我“回放”时间戳,我会得到相同的随机数。

这就是我的意思:

  1. 大多数人不会在随机数中检测到循环或模式。
  2. 无需加密安全。
  3. 必须能够生成所有数字。 (我发现LFSR没有这样做)
  4. 数字为32位整数
  5. 我希望它相当快。

    到目前为止,我的想法是反复播种PRNG,但我不确定这是否是处理此问题的最佳方法。

    非常感谢任何想法和想法。

    感谢。

4 个答案:

答案 0 :(得分:2)

如果不需要统计随机,可能会将时间戳提供给MD5并截断哈希值。主要问题是我不知道这是否是完全的。其他散列算法可能会更好。

答案 1 :(得分:1)

我建议最简单的方法是将时间用于jrand48。像

这样的东西
#include <stdlib.h>
int mix(int t) {
    unsigned short x[3] = {t, t<<16, t};
    return jrand48(x);
}

它是可逆的(2 16 ·x +n≡0x5deece66d·(2 32 +1)·t + 0xb mod 2 48 ⇒ t≡0xdfe05bcb1365·(2 16 ·x + n-0xb)mod 2 48 其中n∈[0,2 16 ))但是它是48位的高32位,实际上并不太容易。 (您可以多次将jrand48应用于x;只要您不应用它2 48 -1次,相同类型的属性将保持不变。 )

答案 2 :(得分:0)

我建议查看符合POSIX标准的drand48()系列函数。它们提供了不错的(但肯定不是加密的)随机数,srand48()获取了32位的种子值。它们是确定性的,因此重用给定的种子将再次重新生成相同的数字序列。

答案 3 :(得分:0)

(timestamp ^ 0x12345678) + 12345678这是否足够微妙?

如果你不关心它的可逆性,你可以每个时间戳crc32。