寻找可重放/有些无状态的PRNG算法
我正在寻找一种“可重放”和“无状态”的伪随机数生成器。 让我详细说明一下:我需要能够根据随机函数的参数重新获取伪随机数。 例如(C型伪代码):
int x1 = random(1);
int x2 = random(2);
// and so on with lots of random() calls in between
int new_x1 = random(1);
// now new_x1 is like a "replay" of x1, so x1 == new_x1
参数的类型并不重要(我可以对所需的任何类型进行类型化),返回值不一定是int
; 最终我需要8位值。
问题是:什么是一种好的PRNG算法,它满足下一个伪随机值由参数控制的要求,而不是每次调用时更新的内部状态? 我不知道如何使用像下面这样糟糕的解决方案:
int random(int input) {
srand(input);
return rand();
}
这将不得不在每次调用时初始化PRNG,这似乎代价很高。 (我正在使用标准srand() / rand()
来说明这一点,我知道有更好的算法,比如Mersenne Twister,但这个想法仍然是一样的。)
一种可能在这里工作的方法是使用像AES或triple-DES这样的分组密码。 你的伪随机生成器可以
int pseudorandomValue(int input) {
return encryptUsingAES(input);
}
这是无状态的,伪随机的(因为AES的输出应该与统计无法区分)和无状态。
希望这可以帮助!
链接地址: http://www.djcxy.com/p/6367.html
上一篇: Looking for a replayable / somewhat stateless PRNG algorithm