srand()的意思

时间:2015-02-03 17:24:49

标签: c++ c random srand time.h

我不理解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))来创建动态随机数?

5 个答案:

答案 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()根据以前的值计算随机数,因此:

formula from wiki

首先 X srand()

设置