崩坏3卡池模拟器及毕业期望概率计算(含保底)

崩坏3卡池模拟器及毕业期望概率计算(含保底)

简介

最近学概率论要求写论文,没什么好写的,所以就整点跟专业相关的东西吧。抽雷律泪目了,想自己算算大概需要多少发能毕业。

概率论学的不太好,而且补给给出的概率是包含保底的,精确的单抽时的概率算不出来,只能通过大量测试的结果倒推概率,结果应该是差不多的。

代码很简陋,c语言写的,只是很多的if,else,和随机数。可以打包很多地方的,写完就不想动了…图一乐就行,也可以抽之前测测今天非不非嘿嘿

程序演示

开始界面
输入数字就可以开冲了,来一发单抽
在这里插入图片描述
好吧镜子,再来十连
在这里插入图片描述
歪了

在这里插入图片描述
这是百万次模拟的结果,用来估算单抽时概率的,我最后校准完就是现在这样,和官方给出的武器2.479%,圣痕1.24%差不多

第四项下面解析

得出的一些有趣结果

这个程序最终算出来的概率和官方给出的是吻合的,但自己测试时明显感觉吃10发保底的次数比游戏里多。米忽悠的算法肯定不是我这么简单
在这里插入图片描述
这次一万人的模拟中可以看出:

  • 可以看到平均毕业得花108抽,中位数没算,应该比这个低一点,我看有up主算的102左右。
  • 欧皇15发毕业了
  • 最非的酋长394发才毕业,出了11把武器,是真的惨,所以求求社区里的人别歪一发就喊自己非了…看的烦
  • 测试的过程中最非的会有600发才许愿毕业,真的很离谱。

再多来几个测试结果给大伙乐呵一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

readme

正常的c语言文件,直接运行,根据提示输入数字即可
up的为袖缠云和戍边套,其他的四星统一叫up外武器了(包括圣痕)

code

#include<stdio.h>
#include<stdlib.h>
#include <time.h>

int main(){
    printf("***********************\n");
    printf("    欢迎来到抽卡模拟器   \n");
    int rad; //随机数
    srand((int)time(NULL));
    char chizi[9][50]={
        "袖缠云","戍边(上)","戍边(中)","戍边(下)",
        "真理之钥","皮里(上)","皮里(中)","皮里(下)",
        "材料"};
    int baodi = 1;
    while(1){
        printf("请选择:\n");
        printf("1.一发单抽  2.一发十连  3.出货概率校准  4.计算平均毕业次数 5.结束程序\n");
        int function;
        scanf("%d",&function);
        
        //单抽出奇迹
        if(baodi!=10 && function==1){
            
            rad =rand()%10000+1;
            if(5000<rad&&rad<5071){
                int i=0;
                while(chizi[0][i]!=0)
                    printf("%c",chizi[0][i++]);
                printf("\n");
                baodi=1;
            }
            else if(5098<=rad&&rad<5148){
                int i=0;
                while(chizi[1][i]!=0)
                    printf("%c",chizi[1][i++]);
                printf("\n");
                baodi=1;
            }
            else if(51467<=rad&&rad<5197){
                int i=0;
                while(chizi[2][i]!=0)
                    printf("%c",chizi[2][i++]);
                printf("\n");
                baodi=1;
            }
            else if(5195<=rad&&rad<5246){
                int i=0;
                while(chizi[3][i]!=0)
                    printf("%c",chizi[3][i++]);
                printf("\n");
                baodi=1;
            }
            else{
                printf("相转移镜面");
                printf("\n");
                baodi++;
            }
        }
        //单抽保底
        else if(baodi==10 && function==1){
            rad =rand()%10000+1;
            if(2001<rad&&rad<4001){
                int i=0;
                while(chizi[0][i]!=0)
                    printf("%c",chizi[0][i++]);
                printf("\n");
                baodi=1;
            }
            else if(4001<=rad&&rad<5001){
                int i=0;
                while(chizi[1][i]!=0)
                    printf("%c",chizi[1][i++]);
                printf("\n");
                baodi=1;
            }
            else if(5001<=rad&&rad<6001){
                int i=0;
                while(chizi[2][i]!=0)
                    printf("%c",chizi[2][i++]);
                printf("\n");
                baodi=1;
            }
            else if(6001<=rad&&rad<7001){
                int i=0;
                while(chizi[3][i]!=0)
                    printf("%c",chizi[3][i++]);
                printf("\n");
                baodi=1;
            }
            else{
                printf("up外武器\n");
                baodi=1;
            }
        }  
        //一发十连
        else if(function==2){
            for(int i=0; i<10; i++){
                if(baodi!=10){
                    rad =rand()%10000+1;
                    if(5000<rad&&rad<5071){
                int i=0;
                while(chizi[0][i]!=0)
                    printf("%c",chizi[0][i++]);
                printf(" ");
                baodi=1;
            }
                    else if(5098<=rad&&rad<5148){
                int i=0;
                while(chizi[1][i]!=0)
                    printf("%c",chizi[1][i++]);
                printf(" ");
                baodi=1;
            }
                    else if(5147<=rad&&rad<5197){
                int i=0;
                while(chizi[2][i]!=0)
                    printf("%c",chizi[2][i++]);
                printf(" ");
                baodi=1;
            }
                    else if(5196<=rad&&rad<5246){
                int i=0;
                while(chizi[3][i]!=0)
                    printf("%c",chizi[3][i++]);
                printf(" ");
                baodi=1;
            }
                    else{
                    printf("镜面");
                    printf(" ");
                    baodi++;
                    }
                }
                else if(baodi==10 ){
            rad =rand()%10000+1;
            if(2001<rad&&rad<4001){
                int i=0;
                while(chizi[0][i]!=0)
                    printf("%c",chizi[0][i++]);
                printf(" ");
                baodi=1;
            }
            else if(4001<=rad&&rad<5001){
                int i=0;
                while(chizi[1][i]!=0)
                    printf("%c",chizi[1][i++]);
                printf(" ");
                baodi=1;
            }
            else if(5001<=rad&&rad<6001){
                int i=0;
                while(chizi[2][i]!=0)
                    printf("%c",chizi[2][i++]);
                printf(" ");
                baodi=1;
            }
            else if(6001<=rad&&rad<7001){
                int i=0;
                while(chizi[3][i]!=0)
                    printf("%c",chizi[3][i++]);
                printf(" ");
                baodi=1;
            }
            else{
                printf("up外 ");
                baodi=1;
            }
        }
            }
            printf("\n");
        }

        //概率计算  先来1000发,查看各类出货情况
        else if(function==3){
            int weapon=0, shang=0, zhong=0, xia=0;
            for(int k=0; k<1000000; k++){
                if(baodi!=10){
                    rad =rand()%10000+1;
                    if(5000<rad&&rad<5071){
                        weapon++;
                        baodi=1;
                    }      
                    else if(5098<=rad&&rad<5148){
                        shang++;
                        baodi=1;
                    }
                    else if(5147<=rad&&rad<5197){
                        zhong++;
                        baodi=1;
                    }
                    else if(5196<=rad&&rad<5246){
                        xia++;
                        baodi=1;
                    }  
                    else
                        baodi++;
                }
                else if(baodi==10 ){
                    rad =rand()%10000+1;
                    if(2001<rad&&rad<4001){
                        weapon++;
                        baodi=1;
                    }
                    else if(6001<=rad&&rad<7001){
                        shang++;
                        baodi=1;
                    }
                    else if(4001<=rad&&rad<5001){
                        zhong++;
                        baodi=1;
                    }
                    else if(5001<=rad&&rad<6001){
                        xia++;
                        baodi=1;
                    }
                    else
                        baodi=1;
                }
            }
            printf("武器:%d\n上:%d\n中:%d\n下:%d\n",weapon,shang,zhong,xia);
        }

        //计算平均毕业期望
        else if(function==4){
            int cs=0;
            int ougou=9999;
            int qiuzhang =0,qw,qs,qz,qx;
            
            for(int k=0; k<10000; k++){
                int weapon=0, shang=0, zhong=0, xia=0;
                int cishu=1;
                baodi =1;
                while(1){
                    
                    if(baodi!=10){
                    rad =rand()%10000+1;
                    if(5000<rad&&rad<5071){
                        weapon++;
                        baodi=1;
                    }      
                    else if(5098<=rad&&rad<5148){
                        shang++;
                        baodi=1;
                    }
                    else if(5147<=rad&&rad<5197){
                        zhong++;
                        baodi=1;
                    }
                    else if(5196<=rad&&rad<5246){
                        xia++;
                        baodi=1;
                    }  
                    else
                        baodi++;
                }
                    else if(baodi==10 ){
                    rad =rand()%10000+1;
                    if(2001<rad&&rad<4001){
                        weapon++;
                        baodi=1;
                    }
                    else if(6001<=rad&&rad<7001){
                        shang++;
                        baodi=1;
                    }
                    else if(4001<=rad&&rad<5001){
                        zhong++;
                        baodi=1;
                    }
                    else if(5001<=rad&&rad<6001){
                        xia++;
                        baodi=1;
                    }
                    else
                        baodi=1;
                }
                    if(weapon>=1&&shang>=1&&zhong>=1&&xia>=1){
                        if(cishu<ougou)
                            ougou=cishu;
                        if(cishu>qiuzhang){
                            qiuzhang= cishu;
                            qw = weapon;
                            qs = shang;
                            qz = zhong;
                            qx = xia;
                        } 
                        cs=cs+cishu;
                        break;
                    }
                    else if(weapon>=1&&shang==0&&zhong>=1&&xia>=1&&(zhong+xia)>=4){
                    
                    if(cishu<ougou)
                            ougou=cishu;
                        if(cishu>qiuzhang){
                            qiuzhang= cishu;
                            qw = weapon;
                            qs = shang;
                            qz = zhong;
                            qx = xia;
                        } 
                            cs=cs+cishu;
                    break;
                    }
                    else if(weapon>=1&&zhong==0&&shang>=1&&xia>=1&&(shang+xia)>=4){
                    if(cishu<ougou)
                            ougou=cishu;
                        if(cishu>qiuzhang){
                            qiuzhang= cishu;
                            qw = weapon;
                            qs = shang;
                            qz = zhong;
                            qx = xia;
                        } 
                    cs=cs+cishu;
                    break;
                    }
                    else if(weapon>=1&&xia==0&&zhong>=1&&shang>=1&&(zhong+shang)>=4){
                    if(cishu<ougou)
                            ougou=cishu;
                        if(cishu>qiuzhang){
                            qiuzhang= cishu;
                            qw = weapon;
                            qs = shang;
                            qz = zhong;
                            qx = xia;
                        } 
                    cs=cs+cishu;
                    break;
                    }
                    cishu++;
                }
            } 
            printf("平均毕业次数:%d\n欧皇:%d\n非洲酋长:%d\n",cs/10000, ougou, qiuzhang);
            printf("酋长武器,上,中,下:%d,%d,%d,%d\n",qw,qs,qz,qx);
        }
        else if(function==5)
            break;
    } 
    return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值