【C++】negative_binomial_distribution(負の二項分布)の使い方を実例付きで解説
C++におけるnegative_binomial_distributionとは
この記事では、C++の標準ライブラリに含まれる negative_binomial_distribution(負の二項分布)について、実際のコード例を交えながら解説します。
negative_binomial_distribution は、<random> ヘッダーで定義されている乱数分布クラスの一つです。このクラスは、負の二項分布と呼ばれる離散確率分布に従う整数値を生成します。
負の二項分布とは、「成功確率 p のベルヌーイ試行を繰り返したときに、k 回目の成功が起こるまでに発生した失敗回数」を表す確率分布です。コンストラクタには成功回数 k と成功確率 p を指定します。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
int main() {
// 試行回数の設定
const int exps = 10000;
const int numberstars = 100;
default_random_engine generator;
negative_binomial_distribution<int> distribution(4, 0.5);
int p[10] = {};
for (int i = 0; i < exps; ++i) {
int counting = distribution(generator);
if (counting < 10)
++p[counting];
}
cout << "Negative binomial distribution with "<< "( k = 4, p = 0.5 ) :" << endl;
// 配列の内容をヒストグラムとして出力
for (int i = 0; i < 10; ++i)
cout << i << ": " << string(p[i] * numberstars / exps, '*') << endl;
return 0;
}実行結果
Negative binomial distribution with ( k = 4, p = 0.5 ) : 0: ***** 1: ************ 2: **************** 3: *************** 4: ************* 5: ********** 6: ******** 7: ***** 8: *** 9: **
コードの解説
このプログラムでは、まず exps にサンプリング回数(10000回)を、numberstars に出力時のスケール調整用の係数を設定しています。
default_random_engine で乱数生成エンジンを作成し、negative_binomial_distribution<int> にパラメータ k = 4(成功回数)、p = 0.5(成功確率)を渡して分布オブジェクトを構築します。
その後、10000回の乱数生成を行い、得られた値が10未満の場合に配列 p の該当要素をインクリメントして出現頻度を記録します。
最後に、各値(0〜9)の発生頻度をアスタリスク(*)の個数で可視化したヒストグラムを出力しています。
実行結果から読み取れること
出力を見ると、値が2〜3付近で最も出現しやすく、そこから離れるほど出現頻度が下がっていることが分かります。これは、成功確率0.5の試行において4回の成功を得るまでに失敗する回数の期待値が k(1-p)/p = 4 となる性質と一致しており、分布が理論通りに動作していることが確認できます。
-
C++でスワップを繰り返して作る辞書順最小の文字列
文字列 s と、文字列中のインデックスのペアを格納した配列 pairs が与えられるとします。pairs[i] = [a, b] は、文字列における2つのインデックス(0始まり)を表します。これらのペアに含まれるインデックス同士の文字は、何回でも自由に入れ替えることができます。このとき、スワップを繰り返すことで得られる文字列のうち、辞書順で最小のものを求めてください。 たとえば、入力が s = dcab、pairs = [[0,3], [1,2]] の場合、出力は bacd になります。まず s[0] と s[3] を入れ替えると s = bcad となり、続けて s[1] と s[2] を
-
【C++ STL】配列のdata()メソッドの使い方を例付きで解説
配列とは配列とは、同じデータ型の要素を連続したメモリ領域に格納したコレクションのことです。C++標準ライブラリには、配列の機能をサポートするライブラリが数多く含まれています。その中の一つが、arrayコンテナのdata()メソッドです。C++のarray::data()は、オブジェクトの先頭要素を指すポインタを返します。これにより、配列の内部バッファへ直接アクセスしたり、連続したメモリを前提とするC言語スタイルのAPIに配列を渡したりすることができます。構文array_name.data();パラメータこの関数は、引数を受け取りません。戻り値配列の先頭要素を指すポインタを返します。戻り値の型は