如何编写两个支持next和previous的随机数生成函数?
我的意思是如何编写两个函数:next_number()
和 previous_number()
,next_number()
函数生成一个新的随机数和 previous_number()
函数生成先前生成的随机数。
例如:
int next_number()
{
// ...?
}
int previous_number()
{
// ...?
}
int num;
// Forward random number generating.
// ---> 54, 86, 32, 46, 17
num = next_number(); // num = 54
num = next_number(); // num = 86
num = next_number(); // num = 32
num = next_number(); // num = 46
num = next_number(); // num = 17
// Backward random number generating.
// <--- 17, 46, 32, 86, 54
num = previous_number(); // num = 46
num = previous_number(); // num = 32
num = previous_number(); // num = 86
num = previous_number(); // num = 54
最佳答案
您可以使用伪随机函数 (PRF) 轻松做到这一点。
这些函数接受一个键和一个值,并根据它们输出一个伪随机数。您将从/dev/random 中选择一个键,该键在程序运行时保持不变,然后为函数提供一个整数,您递增该整数以前进或递减该整数以返回。
这是一个伪代码示例:
initialize():
Key = sufficiently many bytes from /dev/random
N = 0
next_number():
N = N + 1
return my_prf(Key, N)
previous_number():
N = N - 1
return my_prf(Key, N)
在大多数密码学库中都可以找到强伪随机函数。正如 rici 指出的那样,您还可以使用任何加密函数(加密函数是伪随机排列,PRF 的子集,并且周期非常大,差异无关紧要)。
关于algorithm - 具有下一个和上一个支持的随机数生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25168886/