Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 兰德算法依赖于srand和seed是什么?_C_Random_Entropy_Random Seed - Fatal编程技术网

C 兰德算法依赖于srand和seed是什么?

C 兰德算法依赖于srand和seed是什么?,c,random,entropy,random-seed,C,Random,Entropy,Random Seed,当我运行这个代码时 while ... srand (1); printf ("Again the first number: %d\n", rand()%100); 在2台电脑上,我得到了不同的结果。但在每台电脑里,我总是得到相同的随机列表 例如,在PC1中,我总是得到83,86,77,15,93,35,而在PC2中,我总是得到F,G,H,I,J 我想知道他的算法是什么?如果我知道第一个随机数,有没有办法在同一台电脑里知道第二个随机数 第二个随机数取决于种子还是仅取决于最后一个随机数 我

当我运行这个代码时

while ...
 srand (1);
 printf ("Again the first number: %d\n", rand()%100);
在2台电脑上,我得到了不同的结果。但在每台电脑里,我总是得到相同的随机列表

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

我想知道他的算法是什么?如果我知道第一个随机数,有没有办法在同一台电脑里知道第二个随机数

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

我不想把
srand(时间(0))
要得到一个真正的随机数,这不是我的问题,我只想知道第二个随机数是否取决于
srand
+第一个随机数的输入。

PRNG(伪随机数生成器)实际上是某种确定性计算,它从某个内部状态计算下一个值,也正在更新此状态。所以,这些数字看起来只是随机的,从相同的内部状态开始,你会得到相同的数字序列

编辑问题后,不再需要以下部分,将其保留在此处以供参考:


设定PRNG种子将初始化此内部状态。因此,您应该在程序中只播一次种子

如果使用固定值进行种子设定,则在每次运行中都会得到相同的序列,这可能有利于测试

在你的最后一个计划中,在每次跑步中使用不同的种子。C程序中的典型行是

srand(time(0));
它使用当前播种时间。要做到这一点,您需要
#包括


如果我知道第一个随机数,有没有办法在同一台电脑中知道第二个随机数

一般来说,没有。如上所述,良好的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
(至少有64位),但是
rand()
只返回其中的31位。

算法由库决定,
在大多数(如果不是所有)情况下,生成结果数字的函数依赖于程序堆+堆栈内存地址,因此在您的情况下,结果在不同的pc之间没有差异,而是在ram中的不同位置之间,生成的每个新随机数都取决于最后一个随机数,有时计算中也会涉及种子值(首选),只有第一个数才使用种子值计算。

我知道如何放置
srand(时间(0))
对于真正的随机数,我寻找算法(如果存在???)来找到下一个随机数,如果只取决于最后一个随机数+srand的输入,或者取决于另一个东西正如我所说,实现通常具有内部状态(不仅仅是最后一个数)。PRNG有许多算法。在您的案例中使用哪一个完全取决于您的C标准库,算法不是由C标准指定的。我在寻找windows algo,在我的pc中我得到
83,86,77,15,93,35
没有“windows algo”这样的东西。有许多不同的C标准库。Microsoft拥有旧的
msvcrt.dll
,并随visual studio的每个新版本提供更新的标准库。windows上还有其他标准库,如
glibc
。如果你需要知道算法,你应该解释原因(你不知道,你也不需要知道)。@Devhourse你可能想看看线性同余法(参见)或阅读“计算机编程的艺术”第2卷Donald Knuth关于PRNG计算的详细讨论您是否有一个这样工作的PRNG示例?地址可能用于进一步修改种子,但在“随机”数计算中使用它们本身可能会产生一些非常奇怪的分布。此外,“生成的每个新随机数都依赖于最后一个随机数,只有第一个数使用种子值计算。”对于好的PRNG来说是错误的,因为您只能从一个数到下一个相同的数->不好。您的示例在计算中的任何位置都没有使用地址。是的,仅使用最后一个随机数的实现就足以满足C标准的要求,但是,即使是标准中给出的最小示例也有更多的状态。不,这不会在计算中使用地址作为源。这一行只是从该函数中使用的随机表中添加值。不同的运行库听起来可能是一个原因。我不理解这一点。这个问题如何要求非现场资源?PC 1和PC2的具体配置是什么?特别是,每个运行的操作系统(包括版本)、用于为每个系统编译程序的编译器(包括版本)以及每个使用的运行时库(如果不是编译器或操作系统默认值)?另外,请提供在不同系统上产生不同结果的源代码列表。