C ++二项分布

时间:2014-04-02 21:12:33

标签: c++ algorithm binomial-coefficients

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

enter image description here

我选择了函数的一部分:

#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

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:0)

从您的计划中选择&#39;从main调用并且没有给出返回值。请注意你的&#39; k&#39;因为来自while循环,它总是等于零。它首先检查k是否等于零并返回1.(注意,没有变量可以将返回值放入。)然后调用&#39;选择&#39;从二项分布。(注意你没有改变k的值。它总是零!。)。(注意你在程序中调用了两次)

答案 1 :(得分:0)

试试这个

#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标志

进行编译

答案 2 :(得分:0)

您可以使用temmplate编程,以便您编写更少的锅炉代码

#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;
}

输出:

二项式&lt; 10,1&gt; = 10

二项式&lt; 8,3&gt; = 56