运行此代码时
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
的输入+第一个随机数
答案 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中的一个位置到另一个位置,每个新产生的随机数取决于最后一个随机数,有时还取决于种子值的计算(首选),只有第一个数才与种子值一起计算。