红包模拟器,代码已开源!(c++版)经过我的不懈努⼒,研究出了红包算法!
数值是纯随机的,按算法来的,可以保存测试⽂件哒
测试⽂件长这样:
建议开⼀个快捷⽅式调⼩字体来使⽤,避免占满屏;
程序在这⾥~(复制打开)
(上⽅都已失效)
代码本码:
/*
Name: Wechat redpack simulator 1.1.3
Copyright: DA
Author: DA
Date: 18/10/20 22:48
Description:
*/
#include<bits/stdc++.h>
#include<Windows.h>
#include<conio.h>
using namespace std;
string getTime()//时间获取,返回string类型
{
time_t timep;
time (&timep);
char tmp[64];
strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S",localtime(&timep) );//对⽇期和时间进⾏格式化
return tmp;
};
void color(int m) //更改颜⾊
{
HANDLE consolehend;//句柄处理
consolehend = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehend, m);//参数⼀是句柄,⼆是颜⾊代码。
};
int main()
六爻入门{
if(!kbhit())//按键检测
{
system("cls");//清屏
color(4);
cout<<"红包分配模拟器"<<endl<<"作者:DDDDDA"<<endl;
color(8);
cout<<endl<<"按任意键开始";
}
getch();
double sumlin,sumall;
system("cls");
color(4);
int n,times;//⼈数,次数
cout<<"输⼊⼈数~";
cin>>n;
n++;
cout<<"输⼊钱数~";
double sum,man[n],sum2;//钱数,⼈数累加数组,临时变量
cin>>sum;
cout<<"输⼊次数~";
cin>>times;
double i2,n2;//初始化临时浮点变量
n2=n;
sumall=n*sum;
char percent='%';//百分号,⽤于输出。
for(int i=0;i<n;i++)
{
i2=i;n2=n;
man[i]=0;//初始化
system("cls");
printf("初始化中。。。\n进度:%.2lf%c",i2/n2*100,percent);
}
for( ; ; )
{
system("cls");
cout<<"初始化已完成"<<endl;
cout<<"按任意键开始模拟!!";
if(kbhit())
{
break;
}
}
int x;
cout<<"第"<<1<<"/"<<times<<"轮正在进⾏"<<endl;
srand((unsigned int)(time(NULL)));
for(int i=1;i<=times;i++)
{
sum2=sum;
for(int j=0;j<n-1;j++)
{
x=ceil(sum2/(n))*2;
if(x==0)
x=1;
color(4);
man[j]+=((rand()+0.01)/double(RAND_MAX))+rand()%x;//算法
sum2-=man[j];
}
man[n]+=sum2;
system("cls");
color(0xb);
printf("第%d/%d轮正在进⾏\n",i,times);
for(int k=0;k<n-1;k++)
{
color(0xe);
printf("%-4d",k+1);
color(4);
printf("-已取得 %.2lf 软妹币\n",man[k]);
}
}
double big=-1000;//储存最⼤项
double smal=1000000;//储存最⼩项
int bi=0,sm=0;//最⼤最⼩项的序号
for(int i=0;i<n;i++)
sumlin+=man[i];
for(int i=0;i<n;i++)
man[i]+=(sumall-sumlin)/n;
for(int i=0;i<n-1;i++)
{
i2=i;
system("cls");
printf("模拟已结束 \n计算中。。。\n%.2lf%c",i2/n2*100,percent);
if(man[i]>big)
{
big=man[i];
bi=i;
}
if(man[i]<smal)
{
smal=man[i];
sm=i;
}
}
system("cls");
cout<<"计算已完成"<<endl;
Sleep(1000);
system("cls");
for(int i=0;i<n-1;i++)
{
//输出
if(i==bi)
{
color(0xe);cout<<"最多"<<setw(4)<<i+1;color(4);cout<<"-共拿到约";color(0xe);cout<<fixed<<setprecision(2)<<man[bi];color(4);cout<<"软妹币"<<endl;        }
if(i==sm)
{
color(0xa);cout<<"最少"<<setw(4)<<i+1;color(4);cout<<"-共拿到约";color(0xa);cout<<fixed<<setprecision(2)<<man[sm];color(4);cout<<"软妹币"<<endl;
}
if(i!=sm&&i!=bi)
{
color(4);
cout<<""<<setw(4)<<i+1<<"-共拿到约"<<fixed<<setprecision(2)<<man[i]<<"软妹币"<<endl;
}
}
color(0xC);
cout<<endl<<"*按F保存到⽂件*"<<endl;
if(kbhit())
{
if(getch()=='F'||getch()=='f')
{
system("pause");
char fname[20];//⽂件名称
cout<<"输⼊⽂件名称(带扩展名)>>";
scanf("%s", fname);
ofstream outfile;
outfile.open(fname,std::ios::out);
outfile<<"*模拟信息*"<<endl;
double iii,nnn;nnn=n;
outfile<<"模拟时间:"<<getTime()<<endl<<"总⼈数:"<<n-1<<endl<<"轮数:"<<times<<endl<<"每轮分配的钱数:"<<sum<<endl<<"----------------------------------------"<<endl;            outfile<<"*模拟结果*"<<endl;
for(int i=0;i<n-1;i++)
{
iii=i;
printf("保存中。。。\n%2.lf%c",iii/nnn*100,percent);
//输出
system("cls");
if(i==bi)
{
color(0xe);outfile<<"最多"<<setw(4)<<i+1;color(4);outfile<<"-共拿到约";color(0xe);outfile<<fixed<<set
precision(2)<<man[bi];color(4);outfile<<"软妹币"<<endl;
}
if(i==sm)
{
color(0xa);outfile<<"最少"<<setw(4)<<i+1;color(4);outfile<<"-共拿到约";color(0xa);outfile<<fixed<<setprecision(2)<<man[sm];color(4);outfile<<"软妹币"<<endl;
}
if(i!=sm&&i!=bi)
{
color(4);
outfile<<""<<setw(4)<<i+1<<"-共拿到约"<<fixed<<setprecision(2)<<man[i]<<"软妹币"<<endl;
}
}
cout<<"⽂件已保存。"<<endl;
return0;
}
}
system("pause");
}
1.1.3更新的代码
/*
Name: Wechat redpack simulator 1.2.4beta
Copyright: DA
Author: DA
Date: 23/10/20 23:37
Description:
*/
#include<bits/stdc++.h>
#include<Windows.h>
#include<conio.h>
using namespace std;
int limit=0;//数据错误累加器
bool reto;//是否校准
short slash;//闪动
string getTime()//时间获取,返回string类型
{
time_t timep;
time (&timep);
char tmp[64];
strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S",localtime(&timep) );//对⽇期和时间进⾏格式化演员丁莉
return tmp;
}
void color(int m) //更改颜⾊
{
HANDLE consolehend;//句柄处理
consolehend = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehend, m);//参数⼀是句柄,⼆是颜⾊代码。
}
void load(double c,int ll)//进度条参数⼀是进度,参数⼆是颜⾊
{
int i;
color(ll);
printf("\n进度:[");胖丫老公
for(i=1;i<=c/4;i++)
printf("\\");
color(8);
for(i=i;i<=25;i++)
printf("\\");
color(ll);
printf("]");
printf("  %.0lf%c\n",c,'%');
}
int main()
{
for( ; ; )
{
system("cls");//清屏
color(4);
cout<<"红包分配模拟器"<<endl<<"作者:DDDDDA"<<endl;
if(slash==0)
color(8);
else
color(7);
if(slash==2)
color(0xf);
if(slash==3)
color(0);
cout<<endl<<"按任意键开始";
slash++;slash%=4;
Sleep(40);
if(kbhit())
break;
}
getch();
double sumlin,sumall; //已分配的钱数和应分配的钱数,⽤于校准
system("cls");
color(4);
int n,times;//⼈数,次数
cout<<"输⼊⼈数~";
cin>>n;
n++;
cout<<"是否校准(Y/N)";
yn:
switch(getch())
{
case'Y':reto=true;color(2);cout<<endl<<"Y"<<endl;color(4);break;
case'N':reto=false;color(0xc);cout<<endl<<"N"<<endl;color(4);break;
case'y':reto=true;color(2);cout<<endl<<"Y"<<endl;color(4);break;
case'n':reto=false;color(0xc);cout<<endl<<"N"<<endl;color(4);break;
default:goto yn;
}
cout<<"输⼊钱数~";
double sum,man[n],sum2;//钱数,⼈数累加数组,临时变量
cin>>sum;
cout<<"输⼊次数~";
cin>>times;
cout<<"输⼊每⾏输出的个数(不等于零)";
int line;
cin>>line;
line=abs(line);
if(line==0)
line=1;
double i2,n2;//初始化临时浮点变量
n2=n;
double t2=times;
sumall=times*sum;
char percent='%';//百分号,⽤于输出。
for(int i=0;i<n;i++)
{
i2=i;n2=n;
color(0xE);
man[i]=0;//初始化
system("cls");
printf("初始化中。。。\n");
load(i2/n2*100,0xE);
戈伟如 金城武
}
for( ; ; )
{
color(4);
system("cls");
cout<<"初始化已完成"<<endl;
cout<<"按任意键开始模拟!!";
if(kbhit())
{
break;
}
}
int x;
cout<<"第"<<1<<"/"<<times<<"轮正在进⾏"<<endl;
srand((unsigned int)(time(NULL)));
for(int i=1;i<=times;i++)
{
sum2=sum;
for(int j=0;j<n-1;j++)
{
x=ceil(sum2/(n))*2;
if(x==0)
x=1;
color(4);
man[j]+=((rand()+0.01)/double(RAND_MAX))+rand()%x;//算法
sum2-=man[j];
}
man[n]+=sum2;
system("cls");
color(0xb);
printf("第%d/%d轮正在进⾏\n",i,times);
load(i/t2*100,9);
for(int k=0;k<n-1;k++)
{
color(0xe);
祝福老师的贺卡printf("%-4d",k+1);
color(4);
printf("-已取得 %-5.2lf RMB",man[k]);
if((k+1)%line==0)
printf("\n");
else
printf("");
}
}
double big=-1000;//储存最⼤项
double smal=1000000;//储存最⼩项
int bi=0,sm=0;//最⼤最⼩项的序号
double n3=n; //校准⽤变量
if(reto==true)
{
for(int i=0;i<n;i++)
{
i2=i;
system("cls");
color(0xB);
printf("模拟已结束\n校准中。。。");
load(i2/n2*50,0xB);
sumlin+=man[i];
}
}
if(reto==true)
{
int ali=i2/n2*50;
for(int i=0;i<n;i++)
{
i2=i;
system("cls");
color(0xb);
printf("模拟已结束\n校准中。。。");
load(i2/n2*50+ali,0xB);
man[i]*=sumall/sumlin;
}
for(int i=0;i<n-1;i++)
{
i2=i;
system("cls");
color(3);
printf("模拟已结束\n计算中。。。");
load(i2/n2*100,3);
if(man[i]>big)
{
big=man[i];
bi=i;
}
if(man[i]<smal)
{
后羿出装smal=man[i];
sm=i;
}
}
}
system("cls");
cout<<"计算已完成"<<endl;
Sleep(1000);
system("cls");
for(int i=0;i<n-1;i++)
{
//输出
if(i==bi)
{
color(0xe);cout<<"最多"<<setw(4)<<i+1;color(4);cout<<"-共拿到约";
color(0xe);
if(reto==false)
{
cout<<fixed<<setprecision(2)<<man[bi];color(4);cout<<"软妹币"<<endl;            }
else