当我尝试在函数调用中生成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();
}
答案 0 :(得分:4)
根据C11
标准文件,第7.22.2.2章,srand()
函数,
srand()
函数使用该参数作为后续调用rand()
返回的新伪随机数序列的种子。如果随后使用相同的种子值调用srand()
,则应重复伪随机数序列。
因此,代码的问题是您在srand( time(NULL) );
函数中调用了test1()
。实际上,您每次调用test()
函数时都会播放伪随机数生成器。现在,time(NULL)
将返回相同的值一整秒,即它的时间粒度为1秒。因此,在该粒度期内连续调用test()
函数 (1秒)将导致
rand()
的连续调用将生成相同的随机数字集。解决方案:您只需从srand( time(NULL) );
致电main()
。
那就是说,还有两件更重要的事情,
您缺少必需的头文件。对于rand()
和srand()
,您需要stdlib.h
,time()
包括time.h
。
您的int test1()
函数声明返回值为int
,而您的函数没有任何return
语句。如果返回值未在调用者中使用,则可以接受,但如果使用返回值,则调用undefined behavior。因此,最好考虑在return
中添加test()
值,或将返回类型更改为void
。
旁注:
main()
的推荐签名是int main(void)
(在本例中)。 return
值是一种很好的做法,但在main()
的情况下不是必需的。答案 1 :(得分:4)
这是因为你打电话
srand( time(NULL) );
每次使用该功能。它的粒度是一秒,所以如果你在非常短的时间间隔内调用它两次,你将使用相同的值为随机数生成器播种 - 除非时钟碰巧在两个调用之间选择。
您应该在程序开始时拨打srand()
一次。