为什么每次编译和运行时都会使用rand()获得相同的结果?

时间:2009-11-23 14:57:57

标签: c random

每当我运行此代码时,我都会得到相同的结果。

程序

#include<stdlib.h>

int main(int agrc, const char *argv[]) {
 int i = rand();
 printf("%d\n",i);
 for(i=0;i<10;i++) {
  printf("%d\n",rand());
 }
}

结果:

41
18467
6334
26500
19169
15724
11478
29358
26962
24464
5705

我在mingw上运行了这个。其实我正在学习Objective-C

请帮帮我。

4 个答案:

答案 0 :(得分:35)

在使用之前,您需要使用唯一编号为rand函数设定种子。最简单的方法是使用time()

例如

srand(time(NULL));
rand();//now returns a random number

原因是rand()(或任何其他基于算法的函数)提供的随机数不是随机的。 rand函数只接受当前的数字状态,应用转换,将转换结果保存为新状态并返回新状态。

因此,要让rand返回不同的伪随机数,首先必须将rand()的状态设置为唯一的。

答案 1 :(得分:8)

您想要初始化PRNG。

通过调用main()函数将其初始化(通常在srand()内)。

如果您没有初始化PRNG,默认情况下是使用值1初始化它。当然,用一些其他常量值初始化它不会为程序的不同运行提供不同的伪随机数。

srand(1); /* same as default */
srand(42); /* no gain, compared to the line above */

您需要使用随程序的每次运行而更改的值进行初始化。从time()函数返回的值是最常用的值。

srand(time(NULL)); /* different pseudo random numbers almost every run */

time(NULL)的问题是它在同一秒返回相同的值。因此,如果您在同一天的11:35:17两次致电您的程序,您将获得相同的伪随机数。

答案 2 :(得分:3)

只是为了添加Yacoby的回答 - 我有点惊讶它没有默认为基于时间的种子,所以我查了man page

  

如果未提供种子值,则rand()函数将自动播种,值为1.

因此,如果您更改代码以使用seed(1),您仍应看到相同的输出 - 但seed(time())每次都会更改。

答案 3 :(得分:2)

rand 的输出是 - 随机,这意味着它看起来有效随机,但每次都以相同的方式计算,从一个名为a的特殊值开始种子。使用相同的种子值,您将获得相同的随机数序列。

要设置不同的种子,请在开始生成随机数之前在代码中使用标准C函数 void srand(unsigned int)一次。每次运行程序时获取不同序列的随机数的一种常见方法是将种子基于时钟时间。例如。的函数srand(时钟())