使用垃圾值生成随机数或伪随机数

时间:2013-10-26 07:56:46

标签: c garbage-collection

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

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

如果我们使用一百个未初始化的变量来使用它们的组合来生成随机变量,那该怎么办呢?

2 个答案:

答案 0 :(得分:7)

在实践中使用未初始化的变量作为随机值是一个非常糟糕的主意。使用未初始化的值是Undefined Behavior所以一切都可能发生,但实际上,本地未初始化的变量可能具有一些很好的可重复值。有些编译器在优化时非常聪明,可以删除未初始化值的一些用法(相反,将该值设置为常量)。这符合C或C ++标准。

最新C++11标准为随机数定义了一个非常广泛的API。请参阅<random> C ++ 11标准标题。

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

我建议使用一些pseudo-random number generator(例如,请参阅random(3)lrand48(3) ...)并使用一些随机输入进行播种。在Linux上,您可以从/dev/urandom读取一些字节(仔细阅读urandom(4) ...)或将当前时间与当前pid(请参阅time(2)getpid(2))结合使用获得种子。

随机数并不重要,随机性很难在实践中精确定义(问一位数学家,概率专家)。

随机数确实是一个难题。你可以在上面度过一生,并获得博士学位....

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

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

答案 1 :(得分:2)

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

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