我的程序包含一个使用rand()
的函数。该函数将被多次调用,因此我无法将srand()
放在函数的开头。现在,是否有一条通用规则建议srand()
是应该放在函数的头文件中,还是放在main函数的开头?
我的理解是两者都是一样的。唯一的区别是,如果我想在将来重用该函数,在标题中使用srand()
会使函数更加自包含,但最终可能会有多个标题都包含srand()
。< / p>
- 编辑 -
是的,我的意思是
/*header.h*/
srand();
void my_funciton();
所以它不会工作?
答案 0 :(得分:4)
现在,是否存在一条通用规则,建议是否应将srand()放入函数的头文件中
如果你的意思是
/**
* foo.h
*/
srand();
void my_function_that_uses_rand();
不会导致srand
被调用包括头文件;它将被视为旧式隐式int
函数声明(它不适用于C99或更高版本的编译器,因为不再支持隐式int
函数声明),如果您将math.h
包含在同样包含此文件的文件中,则会导致其他问题。
修改强>
实际上,它比这更糟糕,因为调用到srand
需要种子参数,所以如果你想按时随机化,你的头文件看起来像
/**
* foo.h
*/
srand(time(NULL));
void my_function_that_uses_rand();
编译器会立即加入,因为srand(time(NULL));
首先不是有效的声明。
srand
之前,应该调用 rand
一次,这取决于应用程序代码。请注意,如果您始终使用相同的种子值调用srand
,则始终会在rand
次调用中获得相同的值序列。
答案 1 :(得分:3)
一般情况下,图书馆不应该致电srand
。对srand
的调用应该在main
进行一次,并且是应用程序的责任。
任何其他解决方案都会导致多个库相互竞争。
使用包含随机数的库的应用程序应该以适合应用程序的任何方式为随机数生成器播种(图书馆不知道的其他内容:如果应用程序需要可重现的话,例如)。
答案 2 :(得分:1)
标题旨在可重复使用。如果您的标头用于多个源文件,则srand将在意外时间再次冗余执行。把它放在main()或者任何地方,只调用一次。