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

xtr*_*eak 2 c garbage-collection

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

int i;
int LowerLimit=50;
int UpperLimit=60;
int RandomNumber = i%(UpperLimit-LowerLimit) + LowerLimit;
Run Code Online (Sandbox Code Playgroud)

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

Bas*_*tch 7

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

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

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

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

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

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

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

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