概率转化-二分算法-C语言
算法作用:计算存在保底时,实际单次抽取的概率到底为多少,精确到0.000001。
代码如下
#include<stdio.h>
#include<math.h>
using namespace std;
//获取有保底时的单次概率
double doSplit(double left,double right,int times,double P){
if(left >= right)
return 0;
double middle = (left+right)/2;
double result = pow(1 - middle, times) + times*middle - P;
if(result >= 0.00001 || result <= -0.00001){
if(result > 0)
doSplit(left,middle,times,P);
else
doSplit(middle,right,times,P);
}
else
return middle > 0 ? middle : - middle;
}
int main(){
double p = 0;
int times = 0;
while(true){
printf("请输入公示概率(如0.15为15/100):");
scanf("%lf",&p);
printf("请输入保底次数(第几次保底):");
scanf("%d",×);
printf("%d次抽奖中奖期望:%.1f次\n",times,p*1.0*times);
double result = doSplit(0,p,times,p*times);
printf("实际单抽中奖概率:%f\n",result);
}
return 0;
}