美烦资源网

专注技术文章分享,涵盖编程教程、IT 资源与前沿资讯

【新年特辑】信息学奥赛编程技巧—用C++随机函数模拟拼手气红包

首先祝各位读者新年快乐,喜乐安宁,程序全AC,比赛全AK!

说到过年,能够大家最有参与感的非红包莫属,不知道大家在QQ群、微信群或别的聊天群中抢到了多大的红包呢?又有多少次是手气最佳呢?

今天想用C++实现一个模拟拼手气红包的功能。

01 C风格的随机数生成


首先,拼手气红包的本质就是将红包金额根据数量随机分配,因此就需要用到随机数生成器

在C++的头文件中,包含有C语言的rand()和srand()函数来实现生成随机数功能。

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;
}


【运行结果展示】


控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言