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

时间:2015-04-06 19:51:39

标签: c function random time random-seed

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

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

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

#include <stdio.h>
#include <ctype.h>
#include <string.h>

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();
}

2 个答案:

答案 0 :(得分:4)

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

  

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

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

  • PRNG将重新种子相同的
  • rand()的连续调用将生成相同的随机数字集。

解决方案:您只需从srand( time(NULL) );致电main()

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

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

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

  3. 旁注:

    1. main()的推荐签名是int main(void)(在本例中)。
    2. 添加明确的return值是一种很好的做法,但在main()的情况下不是必需的。

答案 1 :(得分:4)

这是因为你打电话

srand( time(NULL) );

每次使用该功能。它的粒度是一秒,所以如果你在非常短的时间间隔内调用它两次,你将使用相同的值为随机数生成器播种 - 除非时钟碰巧在两个调用之间选择

您应该在程序开始时拨打srand() 一次