const sampleSize = 100;
const testNum = 100;
const z95 = 1.96;
// サンプルを生成(0~1一様分布による)
const pv = 1/12; // 母分散
const pe = 1/2; // 母平均
function generateSamples(samples) {
let n = samples.length;
for (let i=0; i<n; i++) {
samples[i] = Math.random();
}
}
// 平均を計算
function calcAvg(a) {
let n = a.length;
let s = 0;
for (let i=0; i<n; i++) {
s += a[i];
}
return s/n;
}
// テスト
function test() {
let count = 0;
let samples = new Array(sampleSize * testNum);
let avgs = new Array(testNum);
let ci_r = z95 * Math.sqrt(pv / sampleSize);
generateSamples(samples);
// テスト毎にサンプル平均を取り、被覆するかどうかを計算する
for (let i=0; i<testNum; i++) {
avgs[i] = calcAvg(samples.slice(i*sampleSize, (i+1)*sampleSize));
if (Math.abs(avgs[i]-pe)<=ci_r) {
count++;
}
}
return count/testNum; // 被覆確率
}
let N = 200;
let count = 0;
for (let i=0; i<N; i++) {
let rate = test();
count += (rate>=0.95) ? 1 : 0;
}
console.log(count/N); // 6割くらいになる