每次用到随机数的时候都会记不清随机数具体的用法,那么自己今天就来好好的总结一下。
伪随机数
首先,介绍一下伪随机数:
rand()
此函数所生成的随机数每次运行都是固定的数字,另外,如果需要生成特定范围的伪随机数,那么就需要用到:
rand() % n + x ;
比如想要生成1-10的随机数,那么 n=10 , x =1
rand() % 10 + 1 ;
TIME函数
如果想要引入真正的随机数,那么就需要知道time函数,在c++中需要引入头文件ctime ( c 中为time.h)
#include<ctime>
在使用时,time存在一个参数,一般设置为0,如果设置为1或者其他整数值,会产生无法转换类型的错误,time函数实际为:
static __inline time_t __CRTDECL time(time_t * _Time)
{
return _time64(_Time);
}
time里实际存放了指向当前时间的指针,内容表示当前时间到1970年1月1日 0点 到现在的秒数。
#include<iostream>
#include<ctime>
using namespace std;
int main(){
cout << " time(NULL): ";
cout << time(NULL) << endl; //15237700651523770065152377006515237700651523770065 是一个很大的数了
return 0;
}
真随机数
由于版本不同,有的编译器可能需要引入<cstdlib>头文件。
存在一个srand()函数,带有一个参数seed作为种子,控制rand() 产生真正的随机数。当然,如果seed相同的话,产生的rand()肯定也是相同的。
#include<iostream>
#include<cstdlib> // it depends your IDE
#include<ctime>
using namespace std;
int main(){
srand((unsigned)time(NULL));
for (int i = 0; i < 5; i++)
cout << rand() << endl; // 9135 13415 14086 27845 16095
return 0;
}
那么问题来了,如何保证seed不同呢,有没有一种东西可以记录并且随时在变化呢,对了,那就是时间。由于时间一直都在变化的特性,我们可以使用时间作为seed,来产生真正的随机数。
产生自定义范围的随机数
当我们知道如何产生随机数以后,结合之前谈到的产生自定义范围的伪随机数,我们同样可以用取模运算,来获取到自己需要范围的数字。
例如,我们想要获取1-10之间的随机数
#include<iostream>
#include<cstdlib> // it depends your IDE
#include<ctime>
using namespace std;
int main(){
srand((unsigned)time(NULL));
for (int i = 0; i < 5; i++)
cout << rand()%10+1 << endl; // 5 10 8 8 5
return 0;
}
那么如果我们想要产生n个随机数,并且可能需要比较他们的大小呢,这时我们可以再循环中用数组保存随机数的值
#include<iostream>
#include<cstdlib> // it depends your IDE
#include<ctime>
using namespace std;
int main(){
int random[5];
srand((unsigned)time(NULL));
for (int i = 0; i < 5; i++)
{
random[i] = rand()%10+1;
cout<<random[i]<<" ";
}
cout<<endl;
return 0;
}
下面附带以一个小小的Demo,关于自动售货机1元抽奖的中奖概率作为练习,没什么技术含量,但求自己娱乐嘛~
#include <iostream>
#include <ctime>
#define TIMES 10000000
using namespace std;
int main(){
double success =0;
double rate = 0;
int random[2];
int count = 1;
while(1)
{
cout<<"第"<<count++<<"次模拟中......"<<endl;
srand((unsigned)time(NULL));
for (int i = 0; i<TIMES;i++) //模拟循环抽奖,求出中奖的概率
{
for (int j = 0; j<2;j++)
{
random[j] = rand()%3+1;
}
if (random[0] == random[1])
{
success ++;
}
}
rate = success/TIMES*100;
cout<<"自动售货机中奖的概率为:"<<rate<<"%"<<endl;
success = 0;
system("PAUSE");
}
return 0;
}
如有不足之处,欢迎大家指出!