首先祝各位读者新年快乐,喜乐安宁,程序全AC,比赛全AK!
说到过年,能够大家最有参与感的非红包莫属,不知道大家在QQ群、微信群或别的聊天群中抢到了多大的红包呢?又有多少次是手气最佳呢?
今天想用C++实现一个模拟拼手气红包的功能。
01 C风格的随机数生成
首先,拼手气红包的本质就是将红包金额根据数量随机分配,因此就需要用到随机数生成器。
在C++的头文件
rand()函数能够生成0到RAND_MAX之间的随机整数,具体RAND_MAX的值会根据环境变化,可能是2^15-1或2^31-1。
这里的dev-C++是32位的,因此对应的RANAD_MAX是32767,即2^15-1。
如果大家反复运行几次随机数的程序,会发现每次“随机”出现的数字都是一样的。这是为什么呢?
★ 原来,C++中的随机数是伪随机,其生成器通过一个初始值(随机数种子)和一系列算法来生成看似随机的数。
因此,想要改变每次运行时随机的数字,就需要修改生成随机数时的某个变量了。在这里,srand()函数可以设置随机数种子,我们一般这么写:
srand(time(0)); //需要先引入头文件#include
调用time(0)函数,将当前时间作为随机数种子,这样每次生成的数字就不一样了。
02 C++的random库
在C++11及后续版本,引入了随机数生成库
具体在使用时,需要先定义一个随机数生成引擎,一般来说我们使用默认的default_random_engine:
default_random_engine a;
cout<<"随机数最小值:"<<a.min()<<endl;
cout<<"随机数最大值:"<<a.max()<<endl;
for(int i=0;i<5;i++){
cout<<a()<<" ";
}
运行结果为:
当然啦,这样的代码来模拟拼手气红包还远远不够,我们需要让它能够生成制定返回内的数字,这样才方便编写代码。在
default_random_engine a; //随机数引擎
uniform_int_distribution x(1,100); //随机数分布对象,指定范围
for(int i=0;i<5;i++){
cout<<x(a)<<" ";
}
这样就可以生成1~100之间(包含1和100)的随机数了。
拼手气红包模拟代码展示
#include
#include
#include
using namespace std;
#define MAXN 1005
float hb[MAXN];
int main(){
float n;
cout<<"请输入红包金额:"<>n;
int num;
cout<<"请输入红包个数:"<>num;
default_random_engine a(time(0)); //设置随机数种子
for(int i=1;i<=num-1;i++){
uniform_real_distribution x(0.01,n); //随机小数的分布对象
float tmp=x(a);
hb[i]=tmp;
n=n-tmp;
}
hb[num]=n; //剩下的都给最后一个人
int max=1;
for(int i=2;i<=num;i++){ ifhbi>hb[max])max=i;
}
for(int i=1;i<=num;i++){
cout<<"第"<<i<<"个人的红包:"<<hb[i];
if(i==max){
cout<<" 手气最佳!!!"<<endl;
}
else cout<<endl;
}
cout<<"祝各位新年快乐,万事如意~"<<endl;
return 0;
}
【运行结果展示】