for(int j=0; j3; 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 style="FONT-SIZE: 18px"#define N 30
......
int a[N];
srand( time( NULL ) );
int n = 0;
for(int k=0; k10000; k++)
{
for(int i=0; iN; i++)
a[i] = rand() % 365;
bool tag = false; // 假设没有相同
for(i=1; iN; i++)
{
for(int j=0; ji; 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 style="FONT-SIZE: 18px"/*
m: 袋中红球的数目
n: 袋中白球的数目
x: 需要取出的数目
y: 红球至少出现的次数
*/
double pro(int m, int n, int x, int y)
{
if(yx) return 0;
if(y==0) return 1; //对y没有要求
if(ym) return 0;
if(x-ny) 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