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

Gin*_*lus 3 c c++ srand

传递未初始化的变量srand而不是结果是不错的主意time(NULL)
它是一个#include和一个函数调用较少.

示例代码:

#include <stdlib.h>

int main(void) {
    {
        usigned seed; //uninitialized
        srand(seed);
    }
    //other code
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代替

#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(NULL));
    //other code
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*rny 13

不,不是.

读取未初始化的值会导致未定义的行为.它可以是零,它可以是半随机的 - 但是因此,它可以重复地是相同的值.它也可能导致编译或运行时错误,或者做任何其他完全不可预测的事情.

然后,编译程序的其他人会注意到编译器有关未初始化值的警告并尝试修复它.他可能正确地修复它,或者给予足够复杂的程序,他可能只是将它初始化为零.这就是"小"错误变成巨大错误的方式.


只需将您的代码段srand()替换为printf():

#include <stdio.h>

int main()
{
    {
        unsigned seed;
        printf("%u\n", seed);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的系统上,它反复给出0.这意味着至少有一个系统会破坏您的代码:).

  • 你继续从未定义的行为开始..."它可以是零,它可以是半随机的......",但这会分散注意力从主要点 - 它可能会崩溃或破坏程序行为 - 所有赌注都关闭,而不只是"种子"的初始值. (2认同)

Moh*_*ain 8

不,访问未初始化的变量是一种未定义的行为.你应该更喜欢time(NULL).未初始化的变量方法可能会引入难以发现的错误或可能会破坏计算机.

大多数情况下,观察到的效果是(在大多数实现中)上面的代码会从堆栈中获取(读取)一些剩余的值,这些值可能为零或其他但在多次运行中可能相同,从而无法实现您的目的.time另一方面很有希望.


eer*_*ika 5

这不是一个好主意.未定义的行为并不能保证您在每次运行时都不会获得相同的种子,这对于随机性是不利的.它不保证您的处理器也不会停止并着火.

  • 它是未定义的行为,因此没有任何保证. (3认同)