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();