C++ srand()的含义
我不理解C++ srand()的含义,c++,c,random,srand,time.h,C++,C,Random,Srand,Time.h,我不理解中创建随机数的srand()的含义。 这是我的密码: /* 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()
的含义。
这是我的密码:
/* 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;
}
为什么srand(1)
的结果不同于srand(2)
?
为什么srand(1)
或srand(2)
的结果不断出现?
为什么我必须使用srand(time(NULL))来创建一个动态随机数?如果您查看:
使用seed值对std::rand()
使用的伪随机数生成器进行种子设定
rand()
有一些内部状态,它从一个调用保存到下一个调用。该函数是确定性的,但我们可以将其输出视为伪随机。因此,通过以下方式产生的价值:
srand(1);
rand();
对于给定的实现,将始终是相同的。这就是为什么笔记上说:
一般来说,在调用rand()和启动程序之前,伪随机数生成器只应播种一次。它不应该重复播种,也不应该在每次希望生成新的一批伪随机数时重新播种
通常所说的随机数生成器实际上是一个伪随机数生成器。这通常意味着您可以生成相同的随机序列,如果您为该序列提供“密钥”,称为“种子”。当您希望测试基于随机化的算法,并且需要确保可重复的结果时,这非常有用 如果你没有“种子”你的随机数发生器,它是种子与1
种子值是定义伪随机数精确序列的整数,但无法提前知道它将是什么序列,也无法通过稍微更改种子来调整序列。即使是种子值中最微小的变化也会导致完全不同的随机序列。srand()使用种子来确定数字。当给定相同的种子时,srand()始终生成相同的数字。如果你不给它一个种子,那么它会使用系统中的某些东西来确定种子是什么,这使得数字看起来是随机的——种子在不断变化。srand(1)永远是一样的。嗯,您需要更好地了解伪随机数生成器(PRNG)是如何工作的。“Pseudo”一词非常重要:实际上,很难生成真正的随机数,只需取一次(如以秒为单位的时间),然后根据它计算其他值就更容易了 即,通常用于
libc
rand()
的线性同余生成器根据先前的值计算随机数,因此:
第一个X由函数rand()
和大多数其他“随机”设置
来源1)是
“伪随机数生成器”的一种实现。
它生成的数字根本不是随机的,只是一个简单的数字
非常长的离散值序列;序列的设计是为了
根据一些合适的定义,连续的数字看起来是随机的
随机的
函数srand()
只是在此序列中设置一个起点
[1] 大多数操作系统都有一些真正随机数的来源,比如
Unix系统上的文件/dev/random
。它们可能会非常慢超过一个小时
但是,只有几个字节。主要是为了种子PRNG。< /P>阅读此:为什么这个标记的C和C++?在C++中,<代码> RAND()/CUT>根本不应该使用,它被禁止,并且C++中的“@ LeMES <代码> RAND())/代码>既不被禁止也不被认为是有害的。它肯定有它的限制,但从C语言的早期就已经存在了。您的第二段不适用于标准库
srand()/rand()
。如果您在rand()
之前没有调用srand()
,它的行为将被记录为好像调用了srand(1)
。
srand(1);
rand();