確率分布で有名なベルヌーイ分布を理解するためにプログラミングで試します。動作環境はVisual Studio Community 2022のバージョン17.7.4です。
概要
ベルヌーイ分布とは、確率${\theta}$で1を、確率${\theta-1}$で0をとる離散確率分布のことです。確率質量関数は次の式で表されます。
P(x|\theta) = \theta^{x}(1 - \theta)^{1-x}
x = 0, 1
\theta\in(0, 1)
簡単に言うとコインを投げて裏表どちらが出るかとか、ゲームで攻撃が命中するか外れるかのような2択の試行を扱う離散確率分布です。
Pythonでの実装
Pythonでベルヌーイ分布を実装する場合、オープンソースのライブラリであるSciPyを使うと簡単に実装できます。SciPyは外部のライブラリなのでインストールされていない場合は、pip installでインストールしてください。Pythonでの実装は以下のようになります。
import scipy.stats as stats
d = stats.bernoulli(0.6) #確率0.6で1が出るベルヌーイ分布を定義
x = d.rvs(10) #ベルヌーイ分布に従うサンプルを10個生成
print(x)
# [0 1 1 1 0 1 1 1 1 0]
print(d.pmf(0)) #0が出る確率
# 0.4
print(d.pmf(1)) #1が出る確率
# 0.6
サンプルではstats.bernoulliの引数を0.6にしているため0より1が出やすくなっています。引数を変更することで0と1の出やすさを操作できます。
C++での実装
C++でベルヌーイ分布を実装する場合は、標準ライブラリのrandomを使います。C++での実装は以下のようになります。
#include <iostream>
#include <random>
int main()
{
std::random_device rng; //乱数インスタンスの生成
std::bernoulli_distribution dist(0.6); //確率0.6で1が出るベルヌーイ分布を定義
//ベルヌーイ分布に従うサンプルを10個生成
for (int i = 0; i < 10; i++)
{
std::cout << dist(rng) << std::endl;
}
std::cout << 1 - dist.p() << std::endl; //0が出る確率
std::cout << dist.p() << std::endl; //1が出る確率
}
C++はPythonと比較すると少し複雑ですが、標準ライブラリにベルヌーイ分布が付いているのでインストールなしで使えます。
参考
https://www.kspub.co.jp/book/detail/5279786.html
https://cpprefjp.github.io/reference/random/bernoulli_distribution/p.html