概率的问题:使用递归与多次试验模拟的分析
2018-10-12 14:08
369 查看
多次枚举:
实例1
口袋中有5只红球,4只白球。随机从口袋中取出3个球,取出1个红球2个白球的概率
<SPAN style="FONT-SIZE: 18px"> 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 style="FONT-SIZE: 18px">#define N 30
......
int a ;
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 style="FONT-SIZE: 18px">/*
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>
相关文章推荐
- (转)Linux共享内存使用常见陷阱与分析(2)-多次进行shmat会出现什么问题
- 算法导论5.4 概率分析和指示器随机变量的进一步使用--几个有趣的问题
- 结合实际问题浅谈如何使用蒙特卡罗算法模拟投资分析
- 485总线在电能表使用中的常见问题及分析(转)
- 在C# 中不使用递归解决“数独”问题的一种方案
- SQL 查询分析中使用net命令问题(轉)
- SQL 查询分析中使用net命令问题
- 故障解决:VS2005的水晶报表在WEB应用程序中多次使用后,就会出现加载报表失败.重启WEB服务器又正常了.过一段时间又出同样问题
- RCP中使用IWorkspaceRunnable解决IResourceChangeListener监听触发多次问题
- List中使用remove出错的问题分析
- 常用算法的递归实现问题分析(针对《数据结构与程序设计》by Robert.L.Kruse)
- 使用PrintWriter对象导致Struts国际化化失败问题的解决及分析
- 停车场模拟问题的分析思路,解决细节。加了关键注释。
- java 使用ireport无法显示图片问题分析
- 使用动态规划解花店问题 两种思考方法分析
- 用matlab模拟一道概率投资问题
- 解决同一页面无法多次使用XmlHttp发起Ajax的问题
- 递归使用,潜在问题
- MATLAB中使用FFT做频谱分析时频率分辨率问题(转载)
- 有关.Net中使用压缩解压缩的问题补充(递归压缩文件夹)