2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Binomial sampling with nodejs

Posted at

nodejsで二項分布のサンプリングを行いたかったので、nodeで書いてみた。

二項分布はベルヌーイ分布に従うサンプリングを何度も行い、その総和をとればいい。
まずベルヌーイ分布に従う確率変数を得るコード。

ベルヌーイ分布

function bernouli(p) {
    if (Math.random() <= p) {
        return 1;
    } else {
        return 0;
    }
}

ベルヌーイ分布は以下の式に従う離散確率分布。そのサンプリングを行うには、一様乱数からとってきた値が確率pより大きいかどうかを見ればいい。

bernouli

二項分布

二項分布はこのベルヌーイ分布のサンプリングをn回行ったときに1となる回数を表現する確率分布。
つまりn回繰り返してその総和をとってあげればいい。

function binomial(n, p) {
    var x = 0;
    for (var i = 0; i < n; i++) {
        x += bernouli(p);
    }
    return x;
}

これで確率分布B(n,p)に従う分布からサンプリングできることになる。
これでいくつか試してみた。

Try

まずはp=0.5の確率、つまり表か裏かがでるような状況で10000回の試行を繰り返す。
そのときに表がでるときの回数の分布は上のプログラムを使って以下のようになった。

Screen Shot 2014-02-15 at 14.43.22.png

普通に考えて5回くらいでるのが一番多そうで、裏がでる確率と同じ確率なので大体左右対称になる。

次にp=0.17にしてみる。サイコロで1の目がでる確率だ。(別に1じゃなくてもいいけれど)
これで同じように10000回試行してみると

Screen Shot 2014-02-15 at 14.44.26.png

やっぱりだいたい1.7回くらいでるのが一番多くなる感じがする。これを見ると10回振って7回以上1が出るなんてことはほとんどないことが分かる。なかなかおもしろい。

npm

コード自体は小さいけれど、また使う機会がありそうなのでnpm moduleにしておいた

binomial-sampling

よかったら使ってください。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?