我不理解srand()
中<time.h>
创建随机数的含义。
这是我的代码:
/* srand example */
#include <stdio.h> /* printf, NULL */
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
int main ()
{
printf ("First number: %d\n", rand()%100);
srand (time(NULL));
printf ("Random number: %d\n", rand()%100);
srand (1);
printf ("Again the first number: %d\n", rand()%100);
return 0;
}
结果是:
First number: 41
Random number: 13
Again the first number: 41
为什么srand(1)
的结果与srand(2)
不同?
为什么srand(1)
或srand(2)
的结果会一次又一次地出现?
为什么我必须使用srand(time(NULL))
来创建动态随机数?
答案 0 :(得分:5)
如果你看docs:
使用值seed种子
std::rand()
使用伪随机数生成器。
rand()
有一些内部状态,它保持从一个呼叫到下一个呼叫。该函数是确定性的 - 但我们可以将其输出视为伪随机。所以产生的价值是:
srand(1);
rand();
对于给定的实现,将始终相同。这就是为什么笔记说明:
一般来说,伪随机数生成器只应在对rand()的任何调用和程序的开始之前播种一次。每次希望生成一批新的伪随机数时,不应重复播种或重新播种。
答案 1 :(得分:1)
srand()使用种子来确定数字是多少。当给出相同的种子时,srand()总是产生相同的数字。如果你没有给它种子,那么它会使用系统中的某些东西来确定种子将是什么,这使得数字看起来是随机的 - 种子在不断变化。 srand(1)将永远是相同的。
答案 2 :(得分:1)
函数rand()
(以及大多数其他“随机”
来源 1 )是
“伪随机数发生器”的实现。
它产生的数字根本不是随机的,而只是数字中的数字
很长的谨慎值序列;序列的设计使得
根据一些合适的定义,连续数字似乎是随机的
随机的。
函数srand()
只是按此顺序设置起点。
[1]大多数操作系统都有一些真正随机数的来源,例如
Unix系统上的文件/dev/random
。它们的速度可能非常慢
但是,几个字节。主要用途是播种PRNG。
答案 3 :(得分:0)
通常称为随机数生成器的实际上是伪随机数生成器。这通常意味着如果您提供&#34;键,则可以生成相同的随机序列。到那个序列,称为&#34;种子&#34;。当您希望测试基于随机化的算法时,这非常有用,并且您需要确保可重复的结果。
如果你没有&#34;种子&#34;您的随机数生成器,它以1
播种种子值是定义伪随机数的确切序列的整数,但是没有办法提前知道它将是什么序列,并且没有办法稍微调整序列换种子。即使种子值的微小变化也会导致完全不同的随机序列。
答案 4 :(得分:0)
嗯,您需要更好地了解伪随机数生成器(PRNG)的工作原理。单词“Pseudo”非常重要:实际上很难生成真正随机的数字,它更容易一次(如秒的时间),然后根据它计算其他值。
即。 线性同余生成器通常用于libc
rand()
根据以前的值计算随机数,因此:
首先 X 由srand()