如何编写两个函数来生成支持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
Run Code Online (Sandbox Code Playgroud)
您可以使用伪随机函数(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)
Run Code Online (Sandbox Code Playgroud)
在大多数加密库中都可以找到强伪随机函数.正如rici指出的那样,你也可以使用任何加密函数(加密函数是伪随机排列,PRF的一个子集,周期非常大,差别无关紧要).