rand算法取决于种子和种子吗?

时间:2018-08-02 10:22:15

标签: c random entropy random-seed

运行此代码时

while ...
 srand (1);
 printf ("Again the first number: %d\n", rand()%100);

在2台PC上,我得到了不同的结果。但是在每台PC上,我总是得到相同的随机列表。

例如在PC 1中,我总是得到83,86,77,15,93,35,在PC2中,我总是得到F, G ,H , I ,J

我想知道什么是算法?如果我知道第一个随机数,有什么办法可以在同一台PC上知道第二个随机数?

第二个随机数取决于种子还是仅取决于最后一个随机数?

我不放srand(time(0));来得到一个真正的随机数,那不是我的问题,我只想知道第二个随机数是否取决于srand的输入+第一个随机数

2 个答案:

答案 0 :(得分:1)

PRNG(伪随机数生成器)实际上是确定性计算,可以从某些内部状态计算下一个值,并同时更新该状态。因此,数字只是 look 随机,并且从相同的内部状态开始,您将获得相同的数字序列。

问题编辑完毕后,不再需要以下部分,请留在这里以供参考:


种子 PRNG初始化此内部状态。因此,您只能在程序中种子 一次

如果您使用固定值进行播种,则每次运行都会得到相同的序列,这可能对测试很有用。

对于您的最终程序,请在每次运行中添加不同的种子。 C程序中的典型行是

srand(time(0));

,它使用当前时间进行播种。您需要#include <time.h>才能做到。


  

如果我知道第一个随机数,有什么办法可以在同一台PC上知道第二个随机数?

通常,不会。如上所述,良好 PRNG使用其他内部状态,或者换句话说,仅返回其状态的 part 作为“随机数”。

这是一个非常简单的示例实现:

static unsigned long long int randval = 1;

void srand(unsigned int seed)
{
    randval = seed;
}

int rand(void)
{
    randval *= 1103515245;
    randval += 12345;
    return (int)((randval / 65536) & 0x7fffffff);
}

您的C库可能具有更复杂的功能,但有助于理解这一概念:此处的内部状态为long long(至少具有64位),但是rand()仅返回31位

答案 1 :(得分:-4)

算法由库确定, 在大多数(如果不是全部)情况下,产生结果数的函数取决于程序堆+堆栈内存地址,因此在您的情况下,结果从一台PC到另一台并没有不同,但从ram中的一个位置到另一个位置,每个新产生的随机数取决于最后一个随机数,有时还取决于种子值的计算(首选),只有第一个数才与种子值一起计算。