C++ 二项分布

Posted

技术标签:

【中文标题】C++ 二项分布【英文标题】:C++ Binomial Distribution 【发布时间】:2014-04-02 21:12:32 【问题描述】:

我正在尝试为以下公式制作一个 C++ 程序:

我做了函数的选择部分:

#include <iostream>
#include <fstream>
using namespace std;


int choose();
void binomialdistribution();

int main()
  choose();
  binomialdistribution();


int choose() 
  double n = 3;
  double k = 0;
  double i;
  double b;
  double value;
  while (k <= n)
    if (0 == k || n == k) 
      return 1;
    
    if (k > n) 
      return 0;
    
    if (k > (n - k)) 
      k = n - k;
    
    if (1 == k) 
      return n;
    
    b = 1;
    for (i = 1; i <= k; ++i) 
      b *= (n - (k - i));
      if (b < 0)
          return -1;
      
      b /= i;
    
    return b;
    cout << k;
    k++;
    binomialdistribution();
  


void binomialdistribution()
  cout << choose();

我的 k 输出为空白,我的 choose() 输出为 0000000000000000000000

任何帮助将不胜感激

【问题讨论】:

在打印 k、递增它并再次调用 binomialdistribution() 之前,您在 while 循环中看起来像 return b choose() 应该返回一个双精度值。 仅供参考 codereview.stackexchange.com 是一个很好的资源,您可以在其中获得更一般的反馈。 @TooTone 您还应该注意,在推荐该站点时,他们通常希望问题中的代码能够正常工作。虽然,由于问题没有询问对代码的一般改进(你不能真正争辩说“任何帮助”归类为那 - 这就是人们所说的),我认为推荐它不是特别合适的,如果没有其他原因,根据定义,未经请求的推荐就是垃圾邮件,即使您推荐另一个 Stack Exchange 网站。 @Dukeling 感谢您关于正确性的观点;我认为垃圾邮件通常具有这样的含义,即该帖子是为了某种个人利益,而我的则不是。我会考虑你所说的,但我还不确定我是否会停止发布链接或制作我认为有帮助的 cmets(我相信其他人有时会从我制作的 cmets 中受益,我知道我'已经从其他人的 cmets 中受益)。 【参考方案1】:

从你的程序中,'choose' 是从 main 调用的,并且没有给出返回值。另外,你的 'k' 将始终等于 0,因为从 while 循环开始。它首先检查 k 是否等于 0 并返回 1 .(注意没有变量可以放入返回值。)然后从二项分布中调用“选择”。(注意您没有更改 k 的值。它将始终为零!)。(注意您调用了两次选择在程序中)

【讨论】:

我将程序更改为 void 并进行了一些小改动,现在一切正常【参考方案2】:

试试这个

#include <cmath>
#include <stdio.h>

int main()
    double p; 
    int k;
    int n;

    scanf("%d%d", &n, &k);
    scanf("%lf", &p);

    if (k > n) return 1;
    if (p > 1 || p < 0) return 1;

    double w = 1;   //neutral element of multiplication

    // n choose k part
    for (int i = n - k + 1; i <= n; ++i) w = w * i;
    for (int i = 1; i <= k; ++i) w = w / i;

    // p^k * (1-p)^(n-k) part
    w = w * pow(p, k) * pow(1.0 - p, n - k);

    printf("%lf\n", w);
    return 0;

有什么不清楚的地方问一下。

还要记得用-lm标志编译

【讨论】:

什么是printf,我以前从未见过,或者scanf printfscanf 是用于打印和扫描数据的 C 函数。您也可以使用cin &gt;&gt; n &gt;&gt; k &gt;&gt; p;cout &lt;&lt; w &lt;&lt; endl;,它们被称为流并且需要包含【参考方案3】:

您可以使用模板编程来编写更少的锅炉代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>    // std::sort
using namespace std;


template <unsigned int N, unsigned int K>
struct Binomial

    enum
    
        value=Binomial<N-1,K-1>::value + Binomial<N-1,K>::value
    ;
;

template <unsigned int N>
struct Binomial<N,0>

    enum
    
        value=1
    ;
;

template <unsigned int N>
struct Binomial<N,N>

    enum
    
        value=1
    ;
;


int main(void)

    std::cout<<" Binomial<10,1> = ";
    std::cout<< Binomial<10,1>::value;
    std::cout<< std::endl;

    std::cout<<" Binomial<8,3> = ";
    std::cout<< Binomial<8,3>::value;
    std::cout<< std::endl;

输出:

二项式 = 10

二项式 = 56

【讨论】:

以上是关于C++ 二项分布的主要内容,如果未能解决你的问题,请参考以下文章

二项分布与泊松分布

常用的概率分布:二项式分布,贝塔分布,狄里克雷分布

二项分布和泊松分布的关系

二项分布(Binomial Distribution)

R二项分布检验:双尾二项检验(Two-tailed Binomial Test)左尾二项检验(Left-tailed Binomial Test)右尾二项检验

二项分布概率最大项K的求法公式 k=(n+1)p是怎么推导的?