關(guān)于明日方舟抽卡概率的計(jì)算(續(xù))
前言:這幾天來,我發(fā)現(xiàn)之前的一篇文章《關(guān)于明日方舟抽卡概率的計(jì)算》總有人看,所以寫下這篇專欄,作為補(bǔ)充,便于讀者的實(shí)際運(yùn)用。
前文(也就是下面文章卡片指向的專欄)

比較詳細(xì)地說明了我的算法思路,而本文則是利用C語言中的簡(jiǎn)單語句,將算法轉(zhuǎn)換為實(shí)際程序,讓計(jì)算機(jī)去求解我們的問題。
由于UP的專業(yè)并不是計(jì)算機(jī)方向,所以寫出的程序難免不完美。若讀者有什么意見,歡迎在評(píng)論區(qū)中留言。

#include<stdio.h>
#include<math.h>
double no_W[310];
int flag[310]={0};
double per;? ? ? ? ? ? //目標(biāo)六星干員占所有六星干員出率比例?
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("請(qǐng)輸入目標(biāo)六星干員出率占六星干員出率的比例:");
scanf("%lf",&per);
? ? if(per==1.0)? //計(jì)算抽到六星期望?
? ? {
? ? 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次時(shí)第一次出貨的概率為:%lf\n",i,b);
? ? }
? ? printf("抽出六星期望:%lf",ave);
? ? }
? ? else? ? ?//計(jì)算n抽得到指定六星的概率?
{
printf("請(qǐng)輸入抽卡次數(shù)上限:");
scanf("%d",&k);
for(i=1;i<=k;i++)
{
printf("抽的次數(shù):%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;
}

若諸位讀者還有其他問題,歡迎在文章下方評(píng)論,我會(huì)盡力解答。