多次枚舉:
實例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("概率=%f\n", 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("%f\n", 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>