C/C++怎么生成“真正的”随机数
C语言中,直接用rand()函数生成随机数的话,会出现一个尴尬的局面,那就是每次运行都会生成相同的一个数,这显然不能满足我们的期望。怎么回事呢?
不管从哲学上说,还是从技术上说,都难以生成绝对随机的随机数,但是我们可以尽可能让那些“伪随机数”更像是“真正的”随机数。
先认识srand()
srand()是随机数发生器的初始化函数。原型函数是srand(unsigned int seed),通过参数seed改变系统提供的种子值。常用的srand((unsigned)time(NULL))就是根据系统的计时器来改变种子值,time(NULL)是用一套预先设定好的算法计算出的随机数,会随着时间变化。
为了清晰地看到seed的值随时间变化的情形,设计了下面几行代码。编译后多次运行,每次都能输出一个不同的值。
#include#includeusing namespace std;
int main()
{
int s=(unsigned)time(NULL);
cout<
再说说seed
系统调用rand()之前会先调用srand(),看用户有没有给seed一个指定的值。如果有,就用这个值作为产生伪随机数的初始值,如果没有,就会用一个固定不变的数作为初始值(这个值与系统有关)。
这就解释了为什么不用srand()给初始值,或是用了srand()但是给一个定值会导致随机数不变的问题。简单的说,只有种子的值变了,随机数才有可能变化。
回归正题
现在,我们貌似能够生成几个像样的随机数了。
#include#include#include#includeusing namespace std;
int main()
{
int a=1,b=50;
srand((unsigned)time(NULL));
for(int i=1;i<=10;++i)
{
int n=a+rand()%(b-a+1);
cout<
上面的代码将生成十个1到50之间的整数随机数。
注:怎么让rand()生成一定范围内的随机整数?
简单说,要生成a到b之间的整数(包含a和b),用a+rand%(b-a+1)就好了。
通俗说,a告诉系统该从哪里开始找随机数,而b-a+1则表示备选范围中一共有多少个整数。
结语
我是个初学者。过去是,现在是,以后还是。
博客有两个目的,一是备忘,虽然是些基础的知识(或是常识),仍然值得回味。二是因为我的水平较低,想多和大家交流,探讨,提升自己的水平。
原创文章,请尊重版权。