データ構造におけるベルヌーイ分布とは?定義・数式・C++実装例をわかりやすく解説
ベルヌーイ分布とは
ベルヌーイ分布(Bernoulli Distribution)は、試行の結果が「成功」と「失敗」の2通りしかない離散確率分布です。結果は x = 1(成功)と x = 0(失敗)という値で表されます。
成功が起こる確率を p、失敗が起こる確率を q とすると、両者は互いに排他的な事象であるため、次の関係が成り立ちます。
q = 1 − p
確率質量関数
以上より、ベルヌーイ分布の確率質量関数は次のように定義されます。
$$P(x)=\begin{cases}1-p \quad & (x = 0)\\p \quad & (x = 1)\end{cases}$$
この式は、次のような1つの式にまとめて書くこともできます。
$$P(x)=p^{x}(1-p)^{1-x}$$
期待値と分散
ベルヌーイ分布の主な統計的性質は以下の通りです。
- 期待値:E[X] = p
- 分散:Var(X) = p(1 − p)
コイン投げの表裏、機械の正常・故障の判定、広告クリックの有無など、「2択の結果」で表現できるあらゆる事象のモデル化に利用されています。
C++による実装例
C++11 以降では、<random> ヘッダーの bernoulli_distribution クラスを使うことで、ベルヌーイ分布に従う乱数を簡単に生成できます。以下は、成功率 70%(p = 0.7)の試行を 10,000 回繰り返し、true と false の出現回数を集計するサンプルプログラムです。
#include <iostream>
#include <random>
using namespace std;
int main(){
const int nrolls = 10000;
default_random_engine generator;
bernoulli_distribution distribution(0.7);
int count = 0; // true の回数をカウント
for (int i = 0; i < nrolls; ++i)
if (distribution(generator))
count++;
cout << "bernoulli_distribution (0.7) x 10000:" << endl;
cout << "true: " << count << endl;
cout << "false: " << nrolls - count << endl;
}
実行結果
bernoulli_distribution (0.7) x 10000: true: 7024 false: 2976
10,000 回の試行のうち、true が 7,024 回、false が 2,976 回となりました。設定した確率 p = 0.7 に従い、約7割が true となる結果が得られており、乱数が正しくベルヌーイ分布に従っていることが確認できます。
-
データ構造入門:最小全域木(Minimum Spanning Tree)とは
全域木(スパニングツリー)とは全域木(スパニングツリー)とは、無向グラフの部分集合であり、グラフ内のすべての頂点を最小限の数の辺で接続した木構造のことを指します。グラフ内のすべての頂点が互いに連結されている場合、必ず少なくとも1つの全域木が存在します。また、1つのグラフに対して、複数の全域木が存在することもあります。最小全域木(MST)とは最小全域木(Minimum Spanning Tree:MST)とは、連結された重み付き無向グラフにおいて、すべての頂点を接続しながら、辺の重みの合計が最小となるような辺の部分集合です。MSTを求めるアルゴリズムとしては、プリム法(Prims algorit
-
データ構造における二分木の表現方法|配列と連結リストの違いを解説
コンピュータメモリ上での二分木の表現方法 ここでは、二分木をコンピュータのメモリ上でどのように表現するかについて解説します。表現方法には主に2種類あり、配列を使う方法と連結リスト(リンクリスト)を使う方法があります。 配列による表現 まず、次のような二分木を例に考えてみましょう。 配列による表現では、木の要素をレベル順(幅優先順)に走査しながら格納していきます。つまり、ノードを上のレベルから順番に保存する方式です。存在しない要素がある場合は、その位置を空白のまま残します。上記の木を配列で表現すると、次のようになります。 123456789101112131415 10516-81520