c - 取决于srand和seed的rand算法是什么?

标签 c random entropy random-seed

当我运行这段代码时

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/

相关文章:

java - 如何在java中使用随机数组和计时器?

c - 在编译时从 __VA_ARGS__ 确定参数类型

android - NDK从 native 代码调用函数

java - 翻转三个连续的正面,然后使用 RandomGenerator 退出程序

c++ std::normal_distribution 从文件恢复时给出不一致的随机数

python - 从图像的 GLCM 计算熵

java - 英语词典的熵

machine-learning - 构建决策树时如何求分割点的熵?

c - typedef 有什么用,它的正确用途是什么?

c - 如何在 C 中删除给定字符串中的溢出字符或附加字符?