2

我遇到了使用垃圾值生成随机数的想法。在 C 中,未初始化的变量被赋予一个垃圾值(但是当我在我的 geany 中尝试它时,它给出一个 0)。所以如果想从50-60中取一个随机数。我可以取垃圾值的模数,然后将它们添加到随机数的初始限制。但是未初始化的变量返回零而不是垃圾值,如这篇文章@如何将垃圾值分配给 c 中的变量

int i;
int LowerLimit=50;
int UpperLimit=60;
int RandomNumber = i%(UpperLimit-LowerLimit) + LowerLimit;

另外,如果我们使用一百个未初始化的变量来使用它们的组合来生成随机变量会怎样。

4

2 回答 2

7

在实践中使用未初始化的变量作为随机值是一个非常糟糕的主意。使用未初始化的值是未定义的行为,所以一切都可能发生,但在实践中,本地未初始化的变量可能会保存一些可重复的值。一些编译器在优化时足够聪明,可以删除未初始化值的某些用途(或者相反,将该值设置为常量)。这符合 C 或 C++ 标准。

最近的C++11标准为随机数定义了一个相当广泛的 API。请参阅<random>C++11 标准头文件。

我的意思是,如果您打印一些未初始化的值,实际上在同一台机器上多次运行同一个程序时,您可能会得到相同的值,我不称之为随机行为。当然,行为是特定于实现的(并且会因系统而异;它取决于操作系统、编译器、优化标志以及用户配置或环境等......)。

我建议使用一些伪随机数生成器(例如,参见random(3)lrand48(3) ...)并用一些随机输入播种它。/dev/urandom在 Linux 上,您可以从(仔细阅读urandom(4) ...)读取一些字节,或者将当前时间与当前 pid 结合起来(参见time(2)getpid(2))以获得种子。

随机数并没有多大意义,而且在实践中很难精确定义随机性(问一位数学家,概率专家)。

随机数确实是一个困难的课题。你可以把你的一生都花在它上面,并获得博士学位......

出于调试目的,您可能希望拥有可重现的伪随机数流。为此,请使用定义明确的种子。

如果您的问题主要取决于具有真正随机且不可预测的数字流(例如,如果您正在编写扑克网站),那么值得花几百欧元(或美元)购买一些硬件随机设备。

于 2013-10-26T08:00:41.557 回答
2

未初始化变量是已声明但在使用前未设置为明确的已知值的变量。它会有一些价值,但不是可预测的。这意味着它可以100存储在变量中,即使你生成一个随机数 1000 次,并且可能在第 1001 次你得到一些其他数字。这不是一个好主意。当某些事情未定义时,我们根本不知道会发生什么,并且生成随机数需要适当的算法,这不是程序员一无所知的事情。

这是非标准的。我相信 SO 期望标准编码。

于 2013-10-26T07:59:02.223 回答