【问题标题】:C++ Binomial DistributionC++ 二项分布
【发布时间】: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 中受益)。

标签: c++ algorithm binomial-coefficients


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2015-12-09
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多