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

Sum*_*sok 7 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());
 }
}
Run Code Online (Sandbox Code Playgroud)

结果:

41
18467
6334
26500
19169
15724
11478
29358
26962
24464
5705
Run Code Online (Sandbox Code Playgroud)

我跑了这个mingw.其实我在学习Objective-C

请帮我.

Yac*_*oby 34

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

例如

srand(time(NULL));
rand();//now returns a random number
Run Code Online (Sandbox Code Playgroud)

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

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

  • 要添加到此答案:每个种子编号(在这种情况下为time())将创建一个不同的随机数列表.但是,如果种子#相同,则列表将是相同的. (9认同)
  • 函数`time`接受一个指向`time_t`对象的指针.做`srand(time(NULL));`相反.并注意在同一秒内对`time(NULL)`的几次调用都返回相同的值. (6认同)

pmg*_*pmg 8

您想要初始化PRNG.

通过调用函数将其初始化一次(通常在内部main())srand().

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

srand(1); /* same as default */
srand(42); /* no gain, compared to the line above */
Run Code Online (Sandbox Code Playgroud)

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

srand(time(NULL)); /* different pseudo random numbers almost every run */
Run Code Online (Sandbox Code Playgroud)

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

  • +1 表示在同一秒内多次调用 srand(time(NULL)) 将产生相同的结果。 (3认同)