告白成功確率 20% の男がひとりの彼女を 80% 以上の確率で獲得できる告白の回数 : 8回
この計算は会社員時代に業務時間中にさんざん計算練習していた課題。
いろいろ感動的な結果が得られる。
感動ポイント
1.
試行回数を増やすほど解析解と計算解の差がなくなる
2.
告白成功確率は60%から70%に上げてもそんなにいいことはないが(2回→2回)
、5%と10%では雲泥の差である(挑戦回数 32回→16回)
だから、現在勝率が低いひとほど努力をする価値が大きいというわけ!!
もちろん、彼女の獲得だけにとどまらない。
会社経営が成功する確率とか、ね。
そして、現実世界では、成功確率は挑戦毎に一定ではない←重要!!!
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
function probabilityOf(d){ let n = Math.random()*100; return (n<d); } function p(a){ console.log(a); } // a% の勝率で b回 挑戦して1回でも成功したらtrue function challengeResult(persentOfWin, attackTimes){ for(let i=0; i<attackTimes; i++){ if(probabilityOf(persentOfWin)){ return true; } } return false; } function winningProportion(persentOfWin, attackTimes){ let times = 20000; let cnt = 0; for(let i=0; i<times; i++){ if(challengeResult(persentOfWin, attackTimes)){ cnt++; } } return cnt * 100.0 / times; } // 成功確率 a のひとが b %の確率で最低1回勝てるような挑戦回数 function calcAttackTimesForProportion(persentOfWin, needProportion){ let attackTimes = 0; while(true){ let wp = winningProportion(persentOfWin, attackTimes); if(needProportion <= wp){ break; }else{ attackTimes++; } } return attackTimes; } // x を底とする y の対数 (logxy) function getBaseLog(x, y) { return Math.log(y) / Math.log(x); } // 解析解 function analyticAttackTimesForProportion(persentOfWin, needProportion){ persentOfWin /= 100.0; needProportion /= 100.0; let x = 1 - persentOfWin; let y = 1 - needProportion; return getBaseLog(x, y); } function dispMsg(persentOfWin, needProportion, attackTimes, title){ let msg = ""; msg += title + " : "; msg += "告白成功確率 " + persentOfWin + "% の男が"; msg += "ひとりの彼女を " + needProportion + "% 以上の確率で"; msg += "獲得できる告白の回数 : " + attackTimes + "回"; p(msg); } // 解析解を出力 function dispAnalyticSolution(persentOfWin, needProportion){ let attackTimes = analyticAttackTimesForProportion(persentOfWin, needProportion); let title = "解析解"; dispMsg(persentOfWin, needProportion, attackTimes, title); } // 計算解を出力 function dispCalculationSolution(persentOfWin, needProportion){ let attackTimes = calcAttackTimesForProportion(persentOfWin, needProportion); let title = "計算解"; dispMsg(persentOfWin, needProportion, attackTimes, title); } // 成功確率p%の男がひとりの彼女をq%以上の確率で獲得できる告白の回数を求めよ function main(){ let p = 20; let q = 80.0; dispCalculationSolution(p, q); dispAnalyticSolution(p, q); } main(); |
1 2 |
計算解 : 告白成功確率 20% の男がひとりの彼女を 80% 以上の確率で獲得できる告白の回数 : 8回 解析解 : 告白成功確率 20% の男がひとりの彼女を 80% 以上の確率で獲得できる告白の回数 : 7.2125674390107815回 |