随机数生成以及之前和之前的支持?

Ami*_*yan 3 random algorithm

如何编写两个函数来生成支持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)

tha*_*guy 5

您可以使用伪随机函数(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的一个子集,周期非常大,差别无关紧要).

  • 在每次调用之前播种的@harold伪随机算法可能会失败它们在不经常重新接种时通过的测试. (2认同)
  • @thatotherguy也许是为了一个"安全"的伪随机算法,但我知道微软的`rand()`有一个问题,即种子和生成的下一个随机数之间存在高度相关性.用递增的数字重新种植它根本不是随机的. (2认同)
  • @ErkiA如果你只播种一次就是这种情况.PRNG总是对其输入具有确定性. (2认同)