C++で学ぶ二項確率変数の基礎と確率計算の実装方法
確率変数とは
確率変数とは、複数の結果が生じうるプロセスの実行結果を表す変数のことです。例えば、コインを1回投げたときに「表」か「裏」のどちらが出るかを表す変数は、典型的な確率変数といえます。
二項確率変数は、確率変数の中でも特殊な種類であり、ある試行において結果が固定した確率で生じる事象に関連する値を持ちます。
二項確率変数が満たすべき4つの条件
ある変数が二項確率変数と呼ばれるためには、以下の性質をすべて満たしている必要があります。
試行の総回数が固定されていること
各試行の結果は「成功」か「失敗」のいずれかであり、中間の結果が存在しないこと
各試行における成功確率が常に同じであること
試行同士が互いに独立しており、依存関係がないこと
二項確率変数の確率計算
試行がちょうどk回成功する確率は、次の二項確率の公式で求められます。
P(x = k) = n! / (k! × (n-k)!) × pk × (1-p)n-k
ここで、nは試行の総回数、kは成功回数、pは1回あたりの成功確率を表します。
この確率に基づいて、二項確率変数の期待値(標本空間における出現回数の平均)は次の式で表されます。
E[X] = np
また、成功回数の分散は以下の式で与えられます。
Var[X] = np(1-p)
C++による実装例
それでは、二項確率の公式をC++で実装してみましょう。以下のサンプルコードは、「表が出る確率1/3のコインを10回投げて、ちょうど5回表が出る確率」を計算します。
#include <iostream>
#include <cmath>
using namespace std;
// 組み合わせ nCr を計算する関数
int combination(int n, int r){
if (r > n / 2)
r = n - r;
int answer = 1;
for (int i = 1; i <= r; i++) {
answer *= (n - r + i);
answer /= i;
}
return answer;
}
// 二項確率を計算する関数
float randombinomialProbability(int n, int k, float p){
return combination(n, k) * pow(p, k) * pow(1 - p, n - k);
}
int main(){
int n = 10;
int k = 5;
float p = 1.0 / 3;
float binomialRandomVariable = randombinomialProbability(n, k, p);
cout << "Probability of " << k;
cout << " heads when a coin is tossed " << n;
cout << " times where probability of each head is " << p;
cout << " is = " << binomialRandomVariable << endl;
}
実行結果
Probability of 5 heads when a coin is tossed 10 times where probability of each head is 0.333333 is = 0.136565
コードの解説
このプログラムのポイントは以下の通りです。
combination関数:組み合わせ nCk を効率的に計算します。対称性 nCk = nC(n-k) を利用することで、計算量を抑えています。
randombinomialProbability関数:二項確率の公式 P(x=k) = nCk × pk × (1-p)n-k をそのまま実装しています。
main関数:試行回数n=10、成功回数k=5、成功確率p=1/3を設定し、確率を計算して出力します。
実行結果より、表が出る確率1/3のコインを10回投げたときにちょうど5回表が出る確率は、約13.66%であることがわかります。二項確率変数の概念は、統計学や機械学習の分野でも広く活用されているため、ぜひマスターしておきましょう。
-
C++でランダムポインタを持つリンクリストをディープコピーする方法
ランダムポインタを持つリンクリストとはリンクリスト(連結リスト)は代表的な線形データ構造の一つで、各ノードは「ノードが保持する値(データ)」と「次のノードのアドレスを格納するポインタ(next)」という2つの部分で構成されます。本記事では、さらに各ノードがリスト内の別のノードを指す「ランダムポインタ(random)」を持つリンクリストを扱います。このようなリストに対して、元のリストと同じデータ・同じランダムポインタ構造を持つ新しいリストを作成することを、リンクリストの「ディープコピー(Deep Copy)」と呼びます。例入力:出力:5-> 2 -> 3 -> 7 ->4
-
C++で学ぶ二項ヒープ(Binomial Heap)の基礎と操作
二項ヒープ(Binomial Heap)とは、二分ヒープ(Binary Heap)を拡張したデータ構造です。二分ヒープが提供する各種操作に加えて、より高速なマージ(union)操作を実現できる点が大きな特徴です。二項ヒープは、複数の二項木(Binomial Tree)のコレクションとして表現されます。二項木(Binomial Tree)とは?次数kの二項木は、次数k-1の二項木を2つ用意し、一方をもう一方の最左の子として連結することで構築できます。次数kの二項木には、以下のような性質があります。ノードの総数は正確に2k個である。木の深さはkである。深さi(i = 0, 1, ..., k)には