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,我以前从未见过,或者scanfprintf
和 scanf
是用于打印和扫描数据的 C 函数。您也可以使用cin >> n >> k >> p;
和cout << w << endl;
,它们被称为流并且需要包含您可以使用模板编程来编写更少的锅炉代码
#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++ 二项分布的主要内容,如果未能解决你的问题,请参考以下文章
R二项分布检验:双尾二项检验(Two-tailed Binomial Test)左尾二项检验(Left-tailed Binomial Test)右尾二项检验