将未初始化的变量传递给srand是个好主意吗

Is it good idea to pass uninitialized variable to srand?

本文关键字:srand 好主意 初始化 变量      更新时间:2023-10-16

将未初始化的变量传递给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/