生成随机数需要 rand() 和 srand() 一起使用,其中 srand() 用来初始化随机数种子, rand() 用来产生随机数。
rand函数--随机数发生器 :
用法:int x=rand(); 可以产生一个0~32767之间的随机数。
生成一定范围的随机数: a + rand() % n;其中的 a 是起始值,n 是整数的范围。
例如 int x=rand()%10; 则生成的是0-9的随机数,不包括10.
生成[a,b]之间的随机数,int x=a + rand()%(b-a+1);随机小数:可以先随机整数,再除以精度。
超范围:如果范围大于32767,可以使用rand()*rand()的方法。
注意:rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。
rand()的调用要依据随机数种子,用户未设定随机数种子时,系统默认的随机数种子为1。
srand函数--初始化随机数发生器:
srand()用来设置随机数种子。
void srand(unsigned int seed); 参数seed必须是个整数,通常可以利用time(0)的返回值(也就是当前时间)或NULL来当做seed。
如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
下面实践试验一下:
只使用rand函数:
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
int x;
for(int i=1; i<=10; i++ ) {
x=rand(); //rand函数
cout<<x<<" ";
}
}
上面的代码运行后也确实产生了10个随机数,似乎并没有什么问题,但是当我们再次运行时发现,产生的随机数还是那10个!
也就是说代码每次产生了相同的随机数。这显然不符合我们的要求。
加上srand()函数:
我们把上面的代码加上srand函数,再次运行发现,每次产生了不同的随机数,满足了我们的需求。
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main(){
int x;
srand(time(0));
for(int i=1; i<=10; i++ ) {
x=rand(); //rand函数
cout<<x<<" ";
}
}
统计次数看看是否满足随机性:
#include<iostream>
using namespace std;
int a[10];
int main(){
srand(time(0)); //产生不同的随机数种子
for(int i=1; i<=100000000; i++ ) {
int x=rand()%10; //rand函数
a[x]++;
}
for (int i=0; i<10; i++)
cout<<a[i]<<" ";
cout << endl;
}
如下我们生成[0,10)之间的随机数10^8次,然后统计每个数字出现的次数,最后发现每个数字出现的次数大约为10^7,说明在每次生成0~10的随机数时,每个数字的产生几率是相等的。