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