微信红包模拟器,代码已开源!(c++版)

经过我的不懈努力,研究出了微信红包算法!

数值是纯随机的按算法来的,可以保存测试文件

测试文件长这样:

建议开一个快捷方式调小字体来使用,避免占满屏;

程序在这里~(复制打开)

https://files.cnblogs.com/files/data-joel/红包概率模拟.zip (版本1.0)

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)

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");
}
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
            {
                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;
}
1.2.4更新的代码

 

代码需通过DEVC++编译哦哦哦(害怕VS会出问题)

另外请先装好环境再下载来用!!

后续算法会继续更新!!

 

默默问一句:复制了,能不能关注再走呀?(点个赞也行呀)

 

/*版本号1.0.2:*/
"·修复了测试文件内容错误的bug"
"·更改了对齐方式"
"·增加了注释

/*版本号1.1.3 alpha:*/
"·增加算法数值准确度,添加了两个变量""

/*版本号1.1.3 beta:*/
"·增加了校准\对齐功能"
"·增加了数值准确性"

/*版本号1.2.4:*/
"·加载样式已改为进度条"
"·增加了细节性bug"
"·增加了行对齐方式,节省屏幕空间"
"·已经可选是否校准"
"·舍弃了原本的测试文件风格"
"·加入了十数个变量"
更新日志

 

posted @ 2020-10-17 20:09  是DA哒  阅读(210)  评论(0编辑  收藏