-7

我不明白srand()in<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))才能创建动态随机数?

4

5 回答 5

5

如果您查看文档

std::rand()使用值种子播种由使用的伪随机数生成器。

rand()有一些内部状态,它从一个调用到下一个调用。该函数是确定性的——但我们可以将其输出视为伪随机。所以产生的价值是:

srand(1);
rand();

对于给定的实现,将始终相同。这就是为什么注释指出:

一般来说,伪随机数生成器应该只播种一次,在调用 rand() 和程序开始之前。每次您希望生成一批新的伪随机数时,不应重复播种或重新播种。

于 2015-02-03T17:29:08.010 回答
1

该函数rand()(以及大多数其他“随机”源1)是“伪随机数生成器”的实现。它生成的数字根本不是随机的,而只是一个非常长的离散值序列中的数字;根据一些合适的随机定义,序列被设计成连续的数字看起来是随机的。

该函数srand()只是在这个序列中设置一个起点。

[1] 大多数操作系统确实有一些真正随机数的来源,例如/dev/randomUnix 系统上的文件。但是,它们对于超过几个字节的速度可能非常慢。主要用途是播种 PRNG。

于 2015-02-03T18:05:24.673 回答
1

srand() 使用种子来确定数字是多少。当给定相同的种子时,srand() 总是产生相同的数字。如果你不给它一个种子,那么它会使用系统中的某些东西来确定种子是什么,这使得数字看起来是随机的——种子是不断变化的。srand(1) 将始终相同。

于 2015-02-03T17:34:55.570 回答
0

通常所说的随机数生成器实际上是一个伪随机数生成器。这通常意味着如果您提供该序列的“密钥”(称为“种子”),您可以生成相同的随机序列。当您希望测试基于随机化的算法并且需要确保可重复的结果时,这非常有用。

如果你不“播种”你的随机数生成器,它会被播种为 1

种子值是定义伪随机数的确切序列的整数,但无法提前知道它将是什么序列,也无法通过稍微改变种子来调整序列。即使种子值的最小变化也会导致完全不同的随机序列。

于 2015-02-03T17:31:19.597 回答
0

嗯,您需要更好地了解伪随机数生成器(PRNG) 的工作原理。“伪”这个词非常重要:实际上很难生成真正的随机数,取一次(比如以秒为单位的时间)然后根据它计算其他值更容易。

线性同余生成器,通常用于libc rand()根据先前值计算随机数,因此:

维基公式

第一个Xsrand()

于 2015-02-03T17:38:32.323 回答