rand()在多个函数调用中是一致的

当我尝试从函数调用中生成2个随机数时,我得到重复的结果。

但是, rand()函数在循环中工作正常,或者提供它们不在函数调用之外。

我猜这是因为系统时间和程序很小。 但我不知道如何改变种子。

 #include  #include  #include  int test1(){ int randX, randY; int range = 5; srand( time(NULL) ); randX = (rand() % range) + 1; randY = (rand() % 15 ) + 1; printf("X:%d Y:%d\n", randX, randY); } int main(){ test1(); test1(); test1(); test1(); test1(); } 

这是因为你打电话

 srand( time(NULL) ); 

每次使用该function。 它的粒度是一秒,所以如果你在非常短的时间间隔内调用它两次,你将使用相同的值为随机数生成器播种 – 除非时钟恰好在两次调用之间打勾。

你应该在程序开始时调用srand() 一次

根据C11标准文件,第7.22.2.2章, srand()函数,

srand()函数使用该参数作为后续调用rand()返回的新伪随机数序列的种子。 如果随后使用相同的种子值调用srand() ,则应重复伪随机数序列。

所以,你的代码的问题是你正在调用srand( time(NULL) );test1()函数内部。 实际上,您每次调用test()函数时都会播放伪随机数生成器。 现在, time(NULL)将返回相同的值一整秒,即它具有1秒的时间粒度。 因此, 在该粒度周期 (1秒) 连续调用test()函数将导致

  • PRNG将以相同的重新播种
  • rand()连续调用将产生相同的随机数集。

解决方案:你需要调用srand( time(NULL) ); 只有一次来自main()

那就是说,还有两件更重要的事情,

  1. 您缺少必需的头文件。 对于rand()srand()你需要有stdlib.h ,对于time()包括time.h

  2. 您的int test1()函数声明具有int类型的返回值,而您的函数没有任何return语句。 如果返回值未在调用者中使用,则可以接受,但如果使用返回值,则将调用未定义的行为 。 因此,最好考虑在test()添加return值或将返回类型更改为void

边注:

  1. main()的推荐签名是int main(void) (在本例中)。
  2. 添加显式return值被认为是一种好的做法,但在main()情况下不是强制性的。