• 締切済み

Objective-Cで二項分布処理

Objective-Cで二項分布の処理を作成したいと思っています。 色々と調べまして、以下の内容で出来そうだというところまでは分かったのですが、 ○○の部分に何を記載すべきか分かりません。 ※ただし○○の部分が分からず動作検証も出来ていない状態ですので、以下の処理すら間違っている可能性もあるかと思います 色々と調べてみたのですが、どうしても処理が作成できないため、 もしご存知の方がいらっしゃいましたら、ご教示頂けますと幸いです。 // 確率pで毎回独立に起こる事象がn回のうちk回起こる確率: P{k}=nCk*p^k*(1-p)^(n-k) - (double)binomial_p:(int)n p:(double)p bk:(int)bk { double q = 1. - p; return ○○ * pow(p,bk) * pow(q,n-bk); }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

上の確率を与える式と見比べればわかるけど nCk の計算 が必要だね. ところで, セレクタの名前がなんか微妙な気がするんだけど....

kumakuma1010
質問者

補足

返信が大変遅くなってしまい申し訳ありません。 ご指摘有り難うございます。 ご指摘頂いた通りnCkを加え実際に計算してみたのですが、それでもうまくいきませんでした。 ※結果は0となり(※正確には100桁ほど小数点以下を表示すると値は入っているのですが・・・) Excelの二項分布関数で計算したものと大きく結果が異なってしまいます。 自分としては、公式通りに計算したつもりだったのですが、間違っている点がどうしても分かりません。 もし問題点が分かるようでしたら、こちらにつきましてもご指摘頂けませんでしょうか? 尚、実行したプログラムと条件は以下の通りです。 条件: 確率1/287で毎回独立に起こる事象が5000回のうち25回起こる確率を計算 プログラム: - (void)viewDidLoad { [super viewDidLoad]; double b = 1; double c = 287; double p = b/c; double n = 5000.0; double bk = 25.0; double a = [self binomial_p:n p:p bk:bk]; //0.018579552になるはず NSLog(@"a:%.9f",a); } //確率pで毎回独立に起こる事象がn回のうちk回起こる確率を計算 - (double)binomial_p:(double)n p:(double)p bk:(double)bk { double q = 1. - p; unsigned long long comb = [self combination:n r:bk]; double b = pow(p,bk); double c = pow(q,n-bk); return comb * b * c; } // 組合せ数 nCr の計算 - (unsigned long long)combination:(int)n r:(int)r { int nn = n; unsigned long long* a = (unsigned long long*)calloc(n,sizeof(unsigned long long)); unsigned long long retv; if ( nn-r < r ) r = nn-r; if ( r == 0 ) return 1; if ( r == 1 ) return nn; for ( int i=1; i<r; i++ ) a[i] = i+2; for ( int i=3; i<=nn-r+1; i++ ) { a[0] = i; for ( int j=1; j<r; j++ ) a[j] += a[j-1]; } retv = a[r-1]; free(a); return retv; }

関連するQ&A

専門家に質問してみよう