在实践中使用未初始化的变量作为随机值是一个非常糟糕的主意。使用未初始化的值是未定义的行为,所以一切都可能发生,但在实践中,本地未初始化的变量可能会保存一些可重复的值。一些编译器在优化时足够聪明,可以删除未初始化值的某些用途(或者相反,将该值设置为常量)。这符合 C 或 C++ 标准。
最近的C++11标准为随机数定义了一个相当广泛的 API。请参阅<random>
C++11 标准头文件。
我的意思是,如果您打印一些未初始化的值,实际上在同一台机器上多次运行同一个程序时,您可能会得到相同的值,我不称之为随机行为。当然,行为是特定于实现的(并且会因系统而异;它取决于操作系统、编译器、优化标志以及用户配置或环境等......)。
我建议使用一些伪随机数生成器(例如,参见random(3)或lrand48(3) ...)并用一些随机输入播种它。/dev/urandom
在 Linux 上,您可以从(仔细阅读urandom(4) ...)读取一些字节,或者将当前时间与当前 pid 结合起来(参见time(2)和getpid(2))以获得种子。
随机数并没有多大意义,而且在实践中很难精确定义随机性(问一位数学家,概率专家)。
随机数确实是一个困难的课题。你可以把你的一生都花在它上面,并获得博士学位......
出于调试目的,您可能希望拥有可重现的伪随机数流。为此,请使用定义明确的种子。
如果您的问题主要取决于具有真正随机且不可预测的数字流(例如,如果您正在编写扑克网站),那么值得花几百欧元(或美元)购买一些硬件随机设备。