プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

データ構造における二項分布の基礎とC++での実装例

二項分布とは

二項分布(Binomial Distribution)とは、N回のベルヌーイ試行においてn回の成功が得られる確率を表す離散型確率分布 Pp(n | N) です。

ここでいうベルヌーイ試行とは、結果が次の2通りしかない試行のことを指します。

  • x = 1:成功(発生確率 p)
  • x = 0:失敗(発生確率 q = 1 − p)

このとき、二項分布は以下の式で表されます。

$$P_{p}\lgroup n\:\arrowvert\ N\rgroup=\left(\begin{array}{c}N\\ n\end{array}\right) p^{n}\lgroup1-p\rgroup^{N-n}$$

つまり、各試行が互いに独立で、成功確率 p が一定である場合、「N回中ちょうどn回成功する確率」は、組み合わせの数(二項係数)と成功・失敗の確率の積として求められます。

C++による二項分布のサンプルコード

C++11以降では標準ライブラリの <random> を使うことで、二項分布に従う乱数を簡単に生成できます。以下は「9回の試行で成功率50%」という設定で10,000回サンプリングし、その度数分布をヒストグラムとして表示する例です。

#include <iostream>
#include <random>
using namespace std;

int main(){
    const int nrolls = 10000;  // 試行回数(サンプリング回数)
    const int nstars = 100;    // 分布させるアスタリスクの最大数

    default_random_engine generator;
    binomial_distribution<int> distribution(9,0.5);

    int p[10]={};

    for (int i=0; i<nrolls; ++i) {
        int number = distribution(generator);
        p[number]++;
    }

    cout << "binomial_distribution (9,0.5):" << endl;
    for (int i=0; i<10; ++i)
        cout << i << ": " << string(p[i]*nstars/nrolls,'*') << endl;
}

コードのポイントは以下の通りです。

  • binomial_distribution<int> distribution(9,0.5):試行回数 N = 9、成功確率 p = 0.5 の二項分布を生成
  • 10,000回乱数を発生させ、得られた値(0〜9)ごとの出現回数を配列 p に集計
  • 出現頻度に応じて * を並べ、ヒストグラムとして可視化

実行結果

0:
1: *
2: ******
3: ***************
4: *************************
5: ************************
6: ****************
7: *******
8: *
9:

実行結果の解説

出力を見ると、分布の山が4と5付近に集中していることが分かります。これは理論的にも妥当な結果です。二項分布の平均(期待値)は E[X] = N × p = 9 × 0.5 = 4.5 となるため、最も出現しやすい値が4〜5のあたりに現れます。

また、0や9といった両端の値がほとんど出現しないのも特徴的です。成功率50%の試行を9回行って「9回すべて成功する」あるいは「9回すべて失敗する」確率は (0.5)9 ≒ 0.195% と非常に小さいためです。

このように、二項分布はコイントスのような「成功か失敗か」の繰り返し試行をモデル化する際に非常に有用であり、統計解析だけでなくシミュレーションやアルゴリズムの設計にも広く活用されています。

  1. データ構造入門:最小全域木(Minimum Spanning Tree)とは

    全域木(スパニングツリー)とは全域木(スパニングツリー)とは、無向グラフの部分集合であり、グラフ内のすべての頂点を最小限の数の辺で接続した木構造のことを指します。グラフ内のすべての頂点が互いに連結されている場合、必ず少なくとも1つの全域木が存在します。また、1つのグラフに対して、複数の全域木が存在することもあります。最小全域木(MST)とは最小全域木(Minimum Spanning Tree:MST)とは、連結された重み付き無向グラフにおいて、すべての頂点を接続しながら、辺の重みの合計が最小となるような辺の部分集合です。MSTを求めるアルゴリズムとしては、プリム法(Prims algorit

  2. データ構造における二分木の表現方法|配列と連結リストの違いを解説

    コンピュータメモリ上での二分木の表現方法 ここでは、二分木をコンピュータのメモリ上でどのように表現するかについて解説します。表現方法には主に2種類あり、配列を使う方法と連結リスト(リンクリスト)を使う方法があります。 配列による表現 まず、次のような二分木を例に考えてみましょう。 配列による表現では、木の要素をレベル順(幅優先順)に走査しながら格納していきます。つまり、ノードを上のレベルから順番に保存する方式です。存在しない要素がある場合は、その位置を空白のまま残します。上記の木を配列で表現すると、次のようになります。 123456789101112131415 10516-81520