欢迎光临散文网 会员登陆 & 注册

关于明日方舟抽卡概率的计算(续)

2021-02-14 10:12 作者:十月飞雪三月飞花  | 我要投稿

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

前文(也就是下面文章卡片指向的专栏)

比较详细地说明了我的算法思路,而本文则是利用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;

}


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

关于明日方舟抽卡概率的计算(续)的评论 (共 条)

分享到微博请遵守国家法律