通过个人不懈努力,研究出了微信红包算法!ios
数值是纯随机的,按算法来的,能够保存测试文件哒c++
测试文件长这样:算法
建议开一个快捷方式调小字体来使用,避免占满屏;数组
程序在这里~(复制打开)微信
https://files.cnblogs.com/files/data-joel/红包几率模拟.zip (版本1.0)
ide
https://files.cnblogs.com/files/data-joel/%E7%BA%A2%E5%8C%85%E6%A6%82%E7%8E%87%E6%A8%A1%E6%8B%9F1.0.2.zip(版本1.0.2)测试
(上方都已失效)字体
https://files.cnblogs.com/files/data-joel/%E7%BA%A2%E5%8C%85%E6%A6%82%E7%8E%87%E6%A8%A1%E6%8B%9F1.1.3.zip(版本1.1.3.alpha)spa
https://files.cnblogs.com/files/data-joel/%E7%BA%A2%E5%8C%85%E6%A6%82%E7%8E%87%E6%A8%A1%E6%8B%9F1.2.4.zip(版本1.2.4)日志
代码本码:
/* 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<<setprecision(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; return 0; } } system("pause"); }
/* 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 { cout<<man[bi];color(4);cout<<"软妹币"<<endl; } } if(i==sm) { color(0xa);cout<<"最少"<<setw(4)<<i+1;color(4);cout<<"-共拿到约"; color(0xa); if(reto==false) { cout<<fixed<<setprecision(2)<<man[sm];color(4);cout<<"软妹币"<<endl; } else { cout<<man[sm];color(4);cout<<"软妹币"<<endl; } } if(i!=sm&&i!=bi) { color(4); if(reto==false) { cout<<" "<<setw(4)<<i+1<<"-共拿到约"<<fixed<<setprecision(2)<<man[i]<<"软妹币"<<endl; } else { cout<<" "<<setw(4)<<i+1<<"-共拿到约"<<man[i]<<"软妹币"<<endl; } } } system("pause"); color(0xC); cout<<endl<<"*按F保存到文件,Q键退出*"<<endl; char a; a=getch(); if(a=='F'||a=='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("保存中。。。"); load(iii/nnn*100,0xc); //输出 system("cls"); if(i==bi) { outfile<<"最多"<<setw(4)<<i+1;color(4);outfile<<"-共拿到约";color(0xe);outfile<<fixed<<setprecision(2)<<man[bi];color(4);outfile<<"软妹币"<<endl; } if(i==sm) { 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) { outfile<<" "<<setw(4)<<i+1<<"-共拿到约"<<fixed<<setprecision(2)<<man[i]<<"软妹币"<<endl; } } cout<<"文件已保存。"<<endl; return 0; } if(a=='Q'||a=='q') return 0; }
代码需经过DEVC++编译哦哦哦(惧怕VS会出问题)
另外请先装好环境再下载来用!!
后续算法会继续更新!!
默默问一句:复制了,能不能关注再走呀?(点个赞也行呀)
/*版本号1.0.2:*/ "·修复了测试文件内容错误的bug" "·更改了对齐方式" "·增长了注释 /*版本号1.1.3 alpha:*/ "·增长算法数值准确度,添加了两个变量"" /*版本号1.1.3 beta:*/ "·增长了校准\对齐功能" "·增长了数值准确性" /*版本号1.2.4:*/ "·加载样式已改成进度条" "·增长了细节性bug" "·增长了行对齐方式,节省屏幕空间" "·已经可选是否校准" "·舍弃了本来的测试文件风格" "·加入了十数个变量"