1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
// 成功率4%の事象に1回でも成功する確率が90%を超えるのは、何回挑戦したときか(57回) const p = console.log; const logxy = (x, y) => Math.log(y) / Math.log(x); const percentOf = percent => { return Math.random() * 100 < percent; }; const N回挑戦して1回以上成功した = (percent, times) => { for (let i = 0; i < times; i++) { if (percentOf(percent)) { return true; } } return false; }; const N回挑戦して1回以上成功する割合 = (percent, times, numberOfTrials) => { let cnt = 0; for (let i = 0; i < numberOfTrials; i++) { if (N回挑戦して1回以上成功した(percent, times)) { cnt++; } } const proportion = cnt * 100.0 / numberOfTrials; return proportion; }; const N回挑戦して1回以上成功する割合がXを超えるN = (percent, numberOfTrials, 希望割合) => { let times = 1; while (true) { const proportion = N回挑戦して1回以上成功する割合(percent, times, numberOfTrials); if (希望割合 <= proportion) { return times; } times++; } }; const N回挑戦して1回以上成功する割合がXを超えるNの計算解 = (P, X) => { const p = P / 100.0; const x = X / 100.0; return logxy(1 - p, 1 - x); }; const test = () => { const percent = 4; const numberOfTrials = 10000; const X = 90; const N = N回挑戦して1回以上成功する割合がXを超えるN(percent, numberOfTrials, X); const M = N回挑戦して1回以上成功する割合がXを超えるNの計算解(percent, X); p(`N回挑戦して1回以上成功する割合が${X}を超えるN : ${N}, 計算解 : ${M}`); }; test(); |
1 |
N回挑戦して1回以上成功する割合が90を超えるN : 57, 計算解 : 56.40550198622811 |