二项分布概率算法

二项分布是一种伯努利试验。即实验结果只有两个,且互为对立事件。

解决类似问题:做一件事N次,成功的概率为p,问成功K次的概率为多少?

使用分治思想,假设前N-1次已经知道实验结果,现在只要求出第N次实验的概率即可。
所以可以使用递归的算法

public static double binomial(int n,int k,double p){
        if(n==0 && k==0)
            return 1;
        if(n<0||k<0)
            return 0;
        return p*binomial(n-1,k-1,p) +(1-p)*binomial(n-1,k,p);
    }

然而这样速度太慢,有什么办法能代替递归呢?
看看递归在这里起了什么作用。递归存储了每一种情况的概率。现在用数组来代替递归实现。

用a[N][K]表示N次事件发生K次的概率

这里我决定逐层往上地求出a[N][K],
所需要的最低层的概率就是a[i][0]和a[0][j] (i∈[0,N],j∈[0,K])
而根据实际情况,a[0][j]的概率必为0(事件总数为0,概率肯定为零)
故而只要初始化a[i][0]的的概率即可

for(int i=0;i<=n;++i){
            a[i][0]=Math.pow(1-p,i);
        }

完整代码为:

public static double binomialNonRecursion(int n,int k,double p){
        double[][] a=new double[n+1][k+1];
        for(int i=0;i<=n;++i){
            a[i][0]=Math.pow(1-p,i);
        }
        for(int i=1;i<=n;++i){
            for(int j=1;j<=k;++j){
                a[i][j]=p*a[i-1][j-1]+(1-p)*a[i-1][j];
            }
        }
        return a[n][k];
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,428评论 0 2
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,792评论 0 89
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,353评论 0 9
  • ​徐峰是个老实人,又是一个十分知趣的人。他能在谈天的时候,滔滔不绝地发出长篇大论。但是这次听了古山的话,竟有些沉默...
    鱼不浊阅读 1,231评论 0 0
  • 1.git init的使用 一般需要创建一个目录,进入该目录,然后输入 git init 可以在当前目录创建一个....
    饥人谷张磊阅读 172评论 0 0