データ構造における幾何分布とは?確率質量関数とC++実装例を解説
幾何分布(Geometric Distribution)は、n = 0, 1, 2, … のような非負の整数値をとる離散型確率分布の一つです。一連の独立した試行において「初めて成功するまでに何回失敗するか」という現象をモデル化するために用いられます。
各試行が互いに独立で、成功確率が一定値 p であるとき、幾何分布の確率質量関数は次の式で表されます。
$$P(n)=p(1-p)^{n}$$
ここで、p は1回あたりの成功確率、(1−p) は失敗確率です。一般的には q = 1 − p とおいて表記することも多くあります。
さらに、累積分布関数(分布関数)は次のように与えられます。
$$D(n)=\displaystyle\sum_{i=0}^{n}P(i)=1-q^{n+1}$$
この式は「n 回目までに少なくとも1回成功する確率」を意味しており、試行を重ねるほど値は1に近づいていきます。
幾何分布の主な性質
- 期待値: E[X] = (1−p)/p
- 分散: V[X] = (1−p)/p²
- 無記憶性: 過去に何回失敗が続いても、これからの成功確率は変わらない
C++による実装例
C++11以降では、標準ヘッダー <random> に含まれる geometric_distribution クラスを使うことで、幾何分布に従う乱数を簡単に生成できます。以下のサンプルコードは、成功確率 p = 0.3 の幾何分布に従う乱数を10,000個生成し、0〜9までの各値の出現回数を星(*)のヒストグラムとして可視化したものです。
#include <iostream>
#include <random>
using namespace std;
int main(){
const int nrolls = 10000; // 試行回数
const int nstars = 100; // 星の最大表示数
default_random_engine generator;
geometric_distribution<int> distribution(0.3);
int p[10] = {};
for (int i = 0; i < nrolls; ++i) {
int number = distribution(generator);
if (number < 10)
p[number]++;
}
cout << "Geometric_distribution(0.3):" << endl;
for (int i = 0; i < 10; ++i)
cout << i << ": " << string(p[i]*nstars/nrolls, '*') << endl;
}
実行結果
0: ***************************** 1: ******************** 2: *************** 3: ********** 4: ******* 5: **** 6: *** 7: ** 8: * 9: *
結果の読み方
出力を見ると、値が小さいほど出現頻度が高く、n が大きくなるにつれて指数関数的に減少していることが確認できます。これが幾何分布の典型的な特徴です。成功確率が高いほど「最初の試行ですぐに成功する(n = 0)」ケースの割合が大きくなり、実際に p = 0.3 の場合、1回目で成功する確率は30%と最も高くなります。
幾何分布は、通信システムの再送制御や信頼性解析、アルゴリズムの計算量解析など、データ構造や確率論が関わるさまざまな分野で応用されている重要な概念です。
-
データ構造入門:最小全域木(Minimum Spanning Tree)とは
全域木(スパニングツリー)とは全域木(スパニングツリー)とは、無向グラフの部分集合であり、グラフ内のすべての頂点を最小限の数の辺で接続した木構造のことを指します。グラフ内のすべての頂点が互いに連結されている場合、必ず少なくとも1つの全域木が存在します。また、1つのグラフに対して、複数の全域木が存在することもあります。最小全域木(MST)とは最小全域木(Minimum Spanning Tree:MST)とは、連結された重み付き無向グラフにおいて、すべての頂点を接続しながら、辺の重みの合計が最小となるような辺の部分集合です。MSTを求めるアルゴリズムとしては、プリム法(Prims algorit
-
データ構造における二分木の表現方法|配列と連結リストの違いを解説
コンピュータメモリ上での二分木の表現方法 ここでは、二分木をコンピュータのメモリ上でどのように表現するかについて解説します。表現方法には主に2種類あり、配列を使う方法と連結リスト(リンクリスト)を使う方法があります。 配列による表現 まず、次のような二分木を例に考えてみましょう。 配列による表現では、木の要素をレベル順(幅優先順)に走査しながら格納していきます。つまり、ノードを上のレベルから順番に保存する方式です。存在しない要素がある場合は、その位置を空白のまま残します。上記の木を配列で表現すると、次のようになります。 123456789101112131415 10516-81520