伪随机序列生成器不仅仅是一个数字生成器
题
我需要一种算法,它几乎可以将 unix 时间戳转换为适当的随机数,这样,如果我“回放”时间戳,我就会得到相同的随机数。
这就是我所说的适当的意思:
- 大多数人不会检测到随机数中的循环或模式。
- 它不必是加密安全的。
- 所有数字都必须能够生成。(我发现 LFSR 不这样做)
- 这些数字是 32 位整数
我希望它能够相当快。
到目前为止,我的想法是一遍又一遍地播种 PRNG,但我不确定这是否是处理这个问题的最佳方法。
任何想法和想法将不胜感激。
谢谢。
解决方案
如果不需要统计随机,可以将时间戳提供给 MD5 并截断哈希值。主要问题是我不知道这是否是主观的。其他哈希算法可能效果更好。
其他提示
我建议最简单的事情就是花时间 jrand48. 。就像是
#include <stdlib.h>
int mix(int t) {
unsigned short x[3] = {t, t<<16, t};
return jrand48(x);
}
它是可逆的(216·x+n=0x5deece66d·(232+1)·t+0xb mod 248 ⇒ t=0xdfe05bcb1365·(216·x+n-0xb) 模 248 其中 n ∈ [0,216)) 但由于它是 48 位中的高 32 位,所以实际上不太容易。(您可以申请 jrand48
到 x
也不止一次;只要你不应用它248-1 次,相同类型的属性将保持。)
我建议查看 POSIX 兼容的 drand48()
函数族。他们给出了体面的(但肯定不是加密的)随机数,并且 srand48()
采用 32 位种子值。它们是确定性的,因此重复使用给定的种子将再次重新生成相同的数字序列。
(timestamp ^ 0x12345678) + 12345678
这够微妙吗?
如果您不关心它的可逆性,您可以对每个时间戳进行 crc32 处理。
不隶属于 StackOverflow