一道概率问题的编程解
2008-09-23 16:28
369 查看
问题:投掷21次硬币,至少一次连续5次或5次以上正面朝上的概率是多少?
我的解答:(brute函数是水木上另一个人给出的解)
#include <cstdio>
#include <cstdlib>
#include <memory.h>
#include <cmath>
#include <vector>
using namespace std;
template<int n, int m> int brute()
{
int c = 0;
for(unsigned int i = 0; i < (1 << n); i++)
{
for(unsigned int t = i; t != 0; t >>= 1)
{
if( (t & ((1 << m) - 1)) == ((1 << m) - 1))
{
c++;
break;
}
}
}
return c;
}
template<int n, int m> double probability()
{
int c = brute<n, m>();
return (double)c / (1 << n);
}
// continuous M from N element
float getPossibility(int N, int M) {
int n = M-1;
vector< vector<int> > f(2, vector<int>(M,0));
for (int i = 0; i < M-1; ++i) {
f[0][i] = 1<<(M-i-2);
}
f[0][M-1] = 1;
int cur = 0;
while (n < N) {
n++;
int last = cur;
cur = (cur+1)%2;
int sum = f[last][4];
for (int cnt = 1; cnt < M; ++cnt) {
f[cur][cnt] = f[last][cnt-1];
sum += f[last][cnt-1];
}
f[cur][0] = sum;
}
int ret = 0;
for (int cnt = 0; cnt < M; ++cnt) {
ret += f[cur][cnt];
}
return 1.0-((float)ret)/(1<<N);
}
int main()
{
float p = getPossibility(5, 5);
printf("%d, %f, %f/n", brute<5, 5>(), probability<5, 5>(), p);
p = getPossibility(6, 5);
printf("%d, %f, %f/n", brute<6, 5>(), probability<6, 5>(), p );
p = getPossibility(21, 5);
printf("%d, %f, %f/n", brute<21, 5>(), probability<21, 5>(), p );
return 0;
}
简单的说明:计算所有5次以下的事件的个数。计算过程可用动态规划进行。
我的解答:(brute函数是水木上另一个人给出的解)
#include <cstdio>
#include <cstdlib>
#include <memory.h>
#include <cmath>
#include <vector>
using namespace std;
template<int n, int m> int brute()
{
int c = 0;
for(unsigned int i = 0; i < (1 << n); i++)
{
for(unsigned int t = i; t != 0; t >>= 1)
{
if( (t & ((1 << m) - 1)) == ((1 << m) - 1))
{
c++;
break;
}
}
}
return c;
}
template<int n, int m> double probability()
{
int c = brute<n, m>();
return (double)c / (1 << n);
}
// continuous M from N element
float getPossibility(int N, int M) {
int n = M-1;
vector< vector<int> > f(2, vector<int>(M,0));
for (int i = 0; i < M-1; ++i) {
f[0][i] = 1<<(M-i-2);
}
f[0][M-1] = 1;
int cur = 0;
while (n < N) {
n++;
int last = cur;
cur = (cur+1)%2;
int sum = f[last][4];
for (int cnt = 1; cnt < M; ++cnt) {
f[cur][cnt] = f[last][cnt-1];
sum += f[last][cnt-1];
}
f[cur][0] = sum;
}
int ret = 0;
for (int cnt = 0; cnt < M; ++cnt) {
ret += f[cur][cnt];
}
return 1.0-((float)ret)/(1<<N);
}
int main()
{
float p = getPossibility(5, 5);
printf("%d, %f, %f/n", brute<5, 5>(), probability<5, 5>(), p);
p = getPossibility(6, 5);
printf("%d, %f, %f/n", brute<6, 5>(), probability<6, 5>(), p );
p = getPossibility(21, 5);
printf("%d, %f, %f/n", brute<21, 5>(), probability<21, 5>(), p );
return 0;
}
简单的说明:计算所有5次以下的事件的个数。计算过程可用动态规划进行。
相关文章推荐
- 一道概率问题:
- 一道经典概率问题
- 一道C语言编程比赛题(时钟追赶问题)
- 编程时遇到概率加密或概率签名后要注意的问题
- 编程时遇到概率加密或概率签名后要注意的问题
- 一道有意思的编程思考题:【妖怪和和尚过河问题】
- 一道概率问题
- 又是一道随机问题,问题是说:写一个函数返回0,1,2,3这几个数字中的一个数,其中0概率是10%,1是20%,2是30%,3是40%
- 如何利用概率思想解决编程问题?
- 一道概率题 疯子坐飞机问题
- 【面试高频问题】一道经典C++网络编程问题的备忘录
- 一道概率题:重男轻女的情况下家庭女孩数量的问题
- 用matlab模拟一道概率投资问题
- 取样问题 总数n事先不知道,等概率取样 (编程珠玑chapter12 课后题10)
- 一道编程之美上的问题-腾讯的笔试题目:求数组的部分乘积
- 牛顿迭代法与一道经典编程问题
- 一道编程问题
- (转)一道经典概率问题
- 一道普通的初三的概率问题
- 一道有趣的排列、组合、数论、概率问题