概率的问题:使用递归与多次试验模拟的分析
概率的问题:使用递归与多次试验模拟的分析
发布时间:2016-12-28 来源:查字典编辑
摘要:多次枚举:实例1口袋中有5只红球,4只白球。随机从口袋中取出3个球,取出1个红球2个白球的概率复制代码代码如下:srand((unsigne...

多次枚举:

实例1

口袋中有5只红球,4只白球。随机从口袋中取出3个球,取出1个红球2个白球的概率

复制代码 代码如下:

<SPAN>srand( (unsigned)time( NULL ) );

int n = 0;

for(int i=0; i<100000; i++)

{

char x[] = {1, 1, 1, 1, 1, 2, 2, 2, 2};//5个红球用5个1表示 4个白球用4个2表示

int a = 0; // 取到的红球的数目

int b = 0; // 取到的白球的数目

for(int j=0; j<3; j++) //取3个球进行3次循环

{

int k = rand() % (9-j); //下标的确定 确定范围 9-j 是重点

if(x[k]==1)

a++;

else

b++;

x[k] = x[9-j-1]; //将取出数向后移动

}

if(a==1 && b==2) n++;//取出1个红球2个白球时进行计数

}

printf("概率=%fn", n/100000.0*100);</SPAN>

实例2

复制代码 代码如下:

<SPAN>#define N 30

......

int a[N];

srand( time( NULL ) );

int n = 0;

for(int k=0; k<10000; k++)

{

for(int i=0; i<N; i++)

a[i] = rand() % 365;

bool tag = false; // 假设没有相同

for(i=1; i<N; i++)

{

for(int j=0; j<i; j++)

{

if(a[i]==a[j])

{

tag = true;

break;

}

}

if(tag) break;

}

if(tag) n++;

}

printf("%fn", 1.0 * n / 10000 * 100);

</SPAN>

递归:

某个袋子中有红球m个,白球n个。现在要从中取出x个球。红球数目多于白球的概率

下面的代码解决了这个问题。其中的y表示红球至少出现的次数。

这与前文的问题是等价的。因为如果取30个球,要求红球数大于白球数,则等价于至少取出16个红球。

复制代码 代码如下:

<SPAN>/*

m: 袋中红球的数目

n: 袋中白球的数目

x: 需要取出的数目

y: 红球至少出现的次数

*/

double pro(int m, int n, int x, int y)

{

if(y>x) return 0;

if(y==0) return 1; //对y没有要求

if(y>m) return 0;

if(x-n>y) return 1; //把白球全部取出,剩下就是红球 红球比至少取出还多,概率为1

double p1 = pro(m-1,n,x-1,y-1) ;

double p2 = pro(m,n-1,x-1,y);

return (double)m/(m+n) * p1 + (double)n/(m+n) * p2;

}</SPAN>

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新C语言学习
热门C语言学习
编程开发子分类