这道题其实只用模拟的方法求解即可,实现代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
#include <time.h>
#define L 1000001
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
int randp(int p){
int r=rand()%100; //生成0-99的随机数
if(r<p){
return 1;
}else{
return 0;
}
}
int main(){
srand((unsigned int)time(0));
int n,p,a;
int n_sum=0,one_sum=0,zero_sum=0;
int one=0,zero=0; //test
scanf("%d%d",&n,&p);
for(int i=0;i<10000000;i++){
a= randp(p);
if(n_sum==n){
one_sum+=1;
n_sum=0;
}else{
if(a==1){
one_sum+=1;
n_sum=0;
}else{
n_sum+=1;
zero_sum+=1;
}
}
}
//printf("one=%d, zero=%d\n",one,zero); //test
printf("%.3lf",(double)one_sum/(double)(one_sum+zero_sum));
return 0;
}
有一点需要注意的,就是需要把设置种子的函数srand放到main函数中,否则无法起到同步重置种子的效果