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()
。
那就是说,还有两件更重要的事情,
-
您缺少必需的头文件。 对于
rand()
和srand()
你需要有stdlib.h
,对于time()
包括time.h
-
您的
int test1()
函数声明具有int
类型的返回值,而您的函数没有任何return
语句。 如果返回值未在调用者中使用,则可以接受,但如果使用返回值,则将调用未定义的行为 。 因此,最好考虑在test()
添加return
值或将返回类型更改为void
。
边注:
-
main()
的推荐签名是int main(void)
(在本例中)。 - 添加显式
return
值被认为是一种好的做法,但在main()
情况下不是强制性的。