将未初始化的变量传递给srand是个好主意吗
Is it good idea to pass uninitialized variable to srand?
将未初始化的变量传递给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;
}
不,不是。
读取未初始化的值会导致未定义的行为。它可以是零,也可以是半随机的——但就其本身而言,它可以重复为相同的值。它还可能导致编译或运行时错误,或者做任何其他完全不可预测的事情。
然后,编译你的程序的其他人会注意到编译器对未初始化值的警告,并试图修复它。他可能会正确修复它,或者如果程序足够复杂,他可能会将其初始化为零。这就是"小"虫子变成大虫子的方式。
只需尝试将srand()
替换为printf()
:即可
#include <stdio.h>
int main()
{
{
unsigned seed;
printf("%un", seed);
}
return 0;
}
在我的系统上,它反复给出0
。这意味着至少有一个系统的代码被破坏了:)。
否,访问未初始化的变量是未定义的行为。您应该更喜欢time(NULL)
。未初始化的变量方法可能会引入难以发现的错误,或者可能会破坏计算机。
大多数时候,观察到的效果是,(在大多数实现中)以上代码会从堆栈中获取(读取)一些剩余值,这些值可能是零或其他值,但在多次运行时可能是相同的,从而破坏您的目的。CCD_ 8则是有前景的。
这不是个好主意。未定义的行为并不能保证你不会在每次跑步中都得到相同的种子,这对随机性不利。它也不能保证你的处理器不会停下来着火。
另一点是未初始化的变量可能会导致漏洞。因此,这不仅是糟糕的设计和未定义的行为,而且会使程序变得可利用。
考虑这个代码:
#include <stdio.h>
#include <time.h>
void print_uninitialized(void) {
unsigned var;
printf("%un", var);
}
void fake_init() {
unsigned var=42;
}
int main(void) {
print_uninitialized();
fake_init();
print_uninitialized();
}
可能输出:
0
42
下一个例子比较现实:
#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 = %un", uninitialized());
while(scanf("%u", &to_square)!=EOF){
printf("%u * %u = %un", to_square, to_square, square(to_square));
printf("UNITNITIALIZED = %un", uninitialized());
}
}
用户可以修改未初始化的变量。
输入:
2
输出:
UNINITIALIZED = 0
2 * 2 = 4
UNITNITIALIZED = 4
在第一种情况下有两种可能性:
- 种子是一个随机变量(可能性较小)
- 种子每次运行都是恒定的(更有可能)
time(NULL)返回系统的时间,每次运行代码时系统的时间相差99.99%。
没有什么是完全随机的,但如果使用第一种方法,使用时间(NULL)会给你一个"更随机"的数字。
您应该检查函数的使用情况http://www.cplusplus.com/reference/cstdlib/srand/
- 什么时候在C++中返回常量引用是个好主意
- 使用嵌套函数数组是个好主意吗?
- 将std::regex设置为静态的好主意吗
- 使用共享库进行变体处理是个好主意吗?
- 使用列表<Byte>不是好主意吗?
- 用C++编写多级内联函数是个好主意吗?
- 重载参数 C++ 是个好主意吗?
- 扩展 std::vector 是个好主意吗?
- 将 int32_t 键入为 int 是个好主意吗?
- 常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
- 使用 QT 开发服务器应用程序是个好主意吗?(QT5)
- 用 constexpr 中的工会取代reinterpret_cast - 好主意?
- 将C 11设置功能更改为带有转发的现代模板功能是一个好主意
- 在哪里使用"std::valarray"是个好主意?
- std :: tr1 :: shared_ptr throw bad_alloc,也是一个好主意
- 在构造函数中循环C++是一个好主意吗?
- 重载指向集合的指针的开始/结束是否是个好主意
- 是一个哨兵 QWidget 一个好主意(以防止在创建和填充布局时出现内存泄漏)
- 搞砸常量是个好主意吗?
- 将未初始化的变量传递给srand是个好主意吗