关于明日方舟抽卡概率的计算(续)
前言:这几天来,我发现之前的一篇文章《关于明日方舟抽卡概率的计算》总有人看,所以写下这篇专栏,作为补充,便于读者的实际运用。
前文(也就是下面文章卡片指向的专栏)

比较详细地说明了我的算法思路,而本文则是利用C语言中的简单语句,将算法转换为实际程序,让计算机去求解我们的问题。
由于UP的专业并不是计算机方向,所以写出的程序难免不完美。若读者有什么意见,欢迎在评论区中留言。

#include<stdio.h>
#include<math.h>
double no_W[310];
int flag[310]={0};
double per; //目标六星干员占所有六星干员出率比例
double ave=0.0; //抽出六星期望
double no_six[100]; //记录无六星概率
double pa(int x,int a)
{
double P;
int i,j;
if(x==1&&a==0)
P=1.0;
else if(x<=a||a<0||a>98)
P=0.0;
else
{
if(a==0)
{
if(flag[x]==0)
{
double sum;
sum=0.0;
for(i=0;i<99;i++)
{
if(i<50)
sum+=0.02*(1-per)*pa(x-1,i);
else
sum+=0.02*(1-per)*(i-48)*pa(x-1,i);
}
P=sum;
no_W[x]=P;
flag[x]=1;
}
else
P=no_W[x];
}
else if(0<a&&a<=50)
P=pow(0.98,a)*pa(x-a,0);
else
{
P=pow(0.98,50)*pa(x-a,0);
for(i=1;i<=a-50;i++)
P=P*(0.98-0.02*i);
}
}
return P;
}
int main()
{
int i,j,k;
double a;
printf("请输入目标六星干员出率占六星干员出率的比例:");
scanf("%lf",&per);
if(per==1.0) //计算抽到六星期望
{
for(i=1;i<100;i++)
{
double b;
a=0.0;
for(j=0;j<99;j++)
{
if(j<50)
a+=(1-0.02*per)*pa(i,j);
else
a+=(1-0.02*per*(j-48))*pa(i,j);
}
no_six[i]=a;
if(i>1)
{
if(i<=50)
{
b=no_six[i-1]*0.02;
ave+=i*b;
}
else
{
b=no_six[i-1]*(0.02+0.02*(i-50));
ave+=i*b;
}
}
else
{
b=0.02;
ave+=0.02;
}
printf("抽%d次时第一次出货的概率为:%lf\n",i,b);
}
printf("抽出六星期望:%lf",ave);
}
else //计算n抽得到指定六星的概率
{
printf("请输入抽卡次数上限:");
scanf("%d",&k);
for(i=1;i<=k;i++)
{
printf("抽的次数:%d\n",i);
a=0.0;
for(j=0;j<99;j++)
{
if(j<50)
a+=(1-0.02*per)*pa(i,j);
else
a+=(1-0.02*per*(j-48))*pa(i,j);
}
a=1-a;
printf("出货率为:%lf\n\n",a);
}
}
return 0;
}

若诸位读者还有其他问题,欢迎在文章下方评论,我会尽力解答。