寻找可重放/有些无状态的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

下一篇: Generating an unique ID from two values