[JavaScript] Chart.jsで確率分布のシミュレーション表示 その1

2020年12月7日月曜日

Chart.js JavaScript

正規分布のイメージとして、二項分布の試行回数をどんどん多くしていった時の近似というのがあるけど、実際にそういう状況をシミュレートしたら案外上手くいったので、調子に乗って他の分布もやってみた。

確率密度関数を使うのではなく、乱数を使って分布を生成しているので、リロードするたびに微妙に違う形になるのが面白い。

準備

まずは準備として、ベルヌーイ分布の乱数を生成する仕組みを作ってみよう。

引数で与えられた確率で、1か0を返す関数
function bernoulli(p) {
  return Math.random() <= p ? 1 : 0;
}

乱数の分布を表現するために、引数で与えられた配列の値をキーとして、登場する回数を要素とする連想配列を生成しよう。
// 配列の要素の頻度(登場回数)を連想配列で返す
function frequency(list) {
  let freq = [];
  for (const key of list) {
    if (freq[key] === undefined) freq[key] = 0;
    freq[key]++;
  }
  return freq;
}
// funcで与えられた関数をn回呼び出して、結果を配列にして返す
function gen_random(func, n) {
  return (new Array(n)).fill().map((_, i) => func());
}
// funcを10000回呼び出して、発生頻度を配列で返す
function freq10K(func) {
  return frequency(gen_random(func, 10000));
}

これにより、以下のように発生頻度を求めることができる。
let rand_ber = gen_random(() => bernoulli(0.5), 5);
// rand_ber [ 1, 1, 0, 1, 0]
let freq_ber = frequency(rand_ber);
// freq_ber { 1 : 3, 0 : 2 }