将未初始化的变量传递给srand
而不是time(NULL)
的结果是否是个好主意?
它是一个#include
和一个函数调用较少。
示例代码:
#include <stdlib.h>
int main(void) {
{
usigned seed; //uninitialized
srand(seed);
}
//other code
return 0;
}
而不是
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL));
//other code
return 0;
}
答案 0 :(得分:13)
不,不是。
读取未初始化的值会导致未定义的行为。它可以是零,它可以是半随机的 - 但是因此,它可以重复地是相同的值。它也可能导致编译或运行时错误,或者做任何其他完全不可预测的事情。
然后,编译程序的其他人会注意到编译器有关未初始化值的警告并尝试修复它。他可能正确地修复它,或者给予足够复杂的程序,他可能只是将它初始化为零。那就是'small' bugs turn into huge bugs。
尝试将srand()
替换为printf()
#include <stdio.h>
int main()
{
{
unsigned seed;
printf("%u\n", seed);
}
return 0;
}
在我的系统上,它反复给出0
。这意味着至少有一个系统会破坏您的代码:)。
答案 1 :(得分:8)
不,访问未初始化的变量是一种未定义的行为。您应该更喜欢time(NULL)
。未初始化的变量方法可能会引入难以发现的错误或者可能会破坏计算机。
大多数情况下,观察到的效果是(在大多数实现中)上面的代码会从堆栈中获取(读取)一些剩余的值,这些值可能为零或其他但在多次运行中可能相同,从而无法实现目的。另一方面,time
很有希望。
答案 2 :(得分:5)
这不是一个好主意。未定义的行为并不能保证您在每次运行中都不会获得相同的种子,这对随机性来说是不利的。它并不能保证您的处理器不会停止并着火。
答案 3 :(得分:2)
另一点是未初始化的变量可能导致vulnerability。所以它不仅是糟糕的设计和未定义的行为,它还可以使您的程序可利用。
考虑this code:
#include <stdio.h>
#include <time.h>
void print_uninitialized(void) {
unsigned var;
printf("%u\n", var);
}
void fake_init() {
unsigned var=42;
}
int main(void) {
print_uninitialized();
fake_init();
print_uninitialized();
}
可能的输出:
0
42
The next example更加现实:
#include <stdio.h>
unsigned uninitialized( void ) {
unsigned var;
return var;
}
unsigned square(unsigned arg){
unsigned result=arg*arg;
return result;
}
int main( void ) {
unsigned to_square;
printf("UNINITIALIZED = %u\n", uninitialized());
while(scanf("%u", &to_square)!=EOF){
printf("%u * %u = %u\n", to_square, to_square, square(to_square));
printf("UNITNITIALIZED = %u\n", uninitialized());
}
}
未初始化的变量可以由用户修改。
输入:
2
输出:
UNINITIALIZED = 0
2 * 2 = 4
UNITNITIALIZED = 4
答案 4 :(得分:0)
在第一种情况下,有两种可能性:
time(NULL)返回每次运行代码时系统的时间差异为99.99%。
没有什么是完美随机的,但是如果你使用第一种方法,使用时间(NULL)会给你一个“更随机”的数字。
你应该检查功能的用法 http://www.cplusplus.com/reference/cstdlib/srand/