当我运行这段代码时
while ...
srand (1);
printf ("Again the first number: %d\n", rand()%100);
在两台电脑上我得到不同的结果。但在每台电脑中我总是得到相同的随机列表。
例如。在 PC 1 中我总是得到 83,86,77,15,93,35
在 PC2 中我总是得到 F, G ,H , I ,J
.
我想知道算法是什么?如果我知道第一个随机数,有什么方法可以知道同一台电脑中的第二个随机数吗? .
第二个随机数取决于种子还是仅取决于最后一个随机数?
我不放srand(time(0));
要获得一个真正的随机数,这不是我的问题,我只想知道第二个随机数是否取决于 srand
的输入+是否为第一个随机数。
最佳答案
PRNG(伪随机数生成器)实际上是某种确定性计算,它根据某些内部状态计算下一个值,并更新该状态。因此,这些数字看起来只是随机的,并且从相同的内部状态开始,您会得到相同的数字序列。
问题修改后,以下部分不再需要,留在这里供引用:
<小时/>播种 PRNG 会初始化此内部状态。因此,您应该在您的计划中播种一次。
如果使用固定值作为种子,则每次运行都会得到相同的序列,这可能有利于测试。
对于您的最终程序,请在每次运行时添加一些不同的内容。 C 程序中的典型行是
srand(time(0));
使用当前时间进行播种。您需要#include <time.h>
来做到这一点。
If I know the first random , is there any way to know the second random in same PC?
一般来说,没有。如上所述,好的 PRNG 使用额外的内部状态,或者,反过来说,只返回其状态的部分作为“随机数”。
这是一个非常简单的示例实现:
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 位。
关于c - 取决于srand和seed的rand算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51651185/