Биномиальное распределение С++

Я пытаюсь сделать программу на С++ для следующей формулы:

введите здесь описание изображения

Я сделал часть выбора функции:

#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 () равен 00000000000000000000000

Любая помощь будет оценена


person hockeynl    schedule 02.04.2014    source источник
comment
Похоже, вы return b выполняете цикл while, прежде чем напечатать k, увеличить его и снова вызвать binomialdistribution().   -  person AndyG    schedule 03.04.2014
comment
choose() должен возвращать двойной.   -  person Zeta    schedule 03.04.2014
comment
К вашему сведению, codereview.stackexchange.com — это хороший ресурс, где вы можете получить более общие отзывы.   -  person TooTone    schedule 03.04.2014
comment
@TooTone Вы также должны отметить, что они обычно ожидают, что код в вопросах будет работать, рекомендуя этот сайт. Хотя, поскольку вопрос не касался общих улучшений кода (вы не можете утверждать, что любая помощь классифицируется как таковая - это просто то, что люди говорят), я не думаю, что рекомендовать это особенно уместно, если нет по другой причине, кроме нежелательных рекомендаций, по определению является спамом, даже если вы рекомендуете другой сайт Stack Exchange.   -  person Bernhard Barker    schedule 03.04.2014
comment
@Dukeling спасибо за ваше замечание о правильности; Я думаю, что спам обычно имеет коннотацию, что сообщение предназначено для какой-то личной выгоды, чего у меня не было. Я рассмотрю то, что вы скажете, но я еще не уверен, что перестану публиковать ссылки или оставлять комментарии, которые я считаю полезными (я считаю, что другим иногда приносили пользу мои комментарии, и я знаю, что я извлек пользу из комментариев других).   -  person TooTone    schedule 03.04.2014
comment
насколько большим может быть ваше n?   -  person shole    schedule 03.04.2014


Ответы (3)


Из вашей программы «выбрать» вызывается из main, а возвращаемое значение не дается. Плюс ваш «k» всегда будет равен нулю, потому что из цикла while. Сначала он проверяет, равен ли k нулю, и возвращает 1. (Примечание нет переменной для ввода возвращаемого значения.) затем вызывает «выбрать» из биномиального распределения. (Обратите внимание, что вы не изменили значение k. Оно всегда будет НОЛЬ!..) (Обратите внимание, что вы дважды вызывали выбор в программе )

person kehindesalaam    schedule 02.04.2014
comment
Я изменил свою программу на пустоту и сделал несколько небольших изменений, и теперь все работает. - person hockeynl; 03.04.2014

Попробуй это

#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

person GSPdibbler    schedule 02.04.2014
comment
Что такое printf, я никогда раньше этого не видел, или scanf, если уж на то пошло - person hockeynl; 03.04.2014
comment
printf и scanf — это функции C для печати и сканирования данных. Вы также можете использовать cin >> n >> k >> p; и cout << w << endl;, они называются потоками и требуют включения ‹iostream›. - person GSPdibbler; 03.04.2014

Вы можете использовать шаблонное программирование, которое позволит вам писать меньше кода котла.

#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,1> = 10

Биномиальное число‹8,3> = 56

person Gabriel    schedule 03.05.2014