2013-10-26 72 views
2

我遇到了使用垃圾值生成随机数的这种想法。在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

如果您确实想要这样做,请使用未初始化的变量来播种伪随机数生成器。更好的是,不要使用这些变量。 – Zeta

+0

你为什么不高兴叫0垃圾值? – glglgl

+0

0怎么能成为垃圾值? @glglgl – xtreak

回答

2

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

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

+0

但是未初始化的值在我的代码中得到零是编译器的依赖吗?我的意思是使用一个100个不同的未初始化的变量,以获得这样的数字在一个函数中,像这样一个函数将它们全部添加到一个随机的数字中,因此使用了模数 – xtreak

+0

'它是依赖于编译器吗? - 不是标准依赖的。变量在每次运行时被放置在同一个确切的内存位置,现在我说这个是用于'auto'存储类的变量,你确定你的变量不是静态的或者全局的吗?如果不是,那么它就是我所谈论的巧合在我的回答中。 – Sadique

+1

@xtreak不,这取决于你在哪里把变量。而且,对于auto变量(又名本地变量),它取决于函数调用和堆栈使用的历史。而在'malloc()'的情况下,它取决于堆使用的历史。 – glglgl

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))组合以获取种子。

随机数并不意味着太多,随机性很难在实践中精确定义(请问数学家,概率专家)。

随机数是一个非常困难的问题。你可以花上你的整个生命,并获得博士学位....

为了调试的目的,你可能希望有一个可重现的伪随机数字流。要做到这一点,请使用明确定义的种子。

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

+0

那么如何使用pi生成的数字没有重复序列? @Basile – xtreak

+0

计算pi的位数(或位)是昂贵的。 –