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 |
/* 一定の確率の攻撃が当たれば相手を倒せる、というゲームを3人で順番にやります。あなたが1番目です [358267739] https://leia.5ch.net/test/read.cgi/poverty/1581785787/1 1 番組の途中ですがアフィサイトへの転載は禁止です (W 0223-6n+Z) 2020/02/16(日) 01:56:27.98 ID:iPbMNis60 BE:358267739-2BP(1000) 久保建英、攻撃活性化で存在感! スペイン紙も高評価「試合に電気を通してマジョルカを改善」 https://headlines.yahoo.co.jp/article?a=20200216-00362678-footballc-socc 自分の番になった人は、他の2人のどちらかを狙って攻撃できます。ただし、「わざと攻撃を外す」ということもできます 3人のターンが終わったあと、3人とも倒されていなかった場合は「全員負け」になります 2人以下になった場合はそのまま順番通りに続行します 2番目の人の攻撃成功確率が70% 3番目の人の攻撃成功確率が90%です さて、あなたは攻撃成功確率が 60% 80% 100% の3種類の攻撃の選択肢があります。一度選ぶと、ゲーム中にそれを変えることはできません さて、他の2人は理論上最も高い確率で自分が勝てる行動を選びます。あなたはどういう行動を選べば最も勝つ確率が高いでしょうか?ishipi | pro connector (@ishipi_88)さんをチェックしよう https://twitter.com/ishipi_88?s=09 */ // シミュレータ読込 const { run } = require('./battlesim.js'); // 自分の攻撃成功確率 const myAccuracy = 60; // trueなら最初の攻撃をパスする const firstCommandIsPass = true; // シミュレーション回数 const times = 10000; // シミュレーション開始 run(myAccuracy, firstCommandIsPass, times); |
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
'use strict'; const p = console.log; const dp = (obj, label = 'debug') => { console.log(label + ' : ' + JSON.stringify(obj)); }; const nPercentProbability = percent => { const randomDouble100 = Math.random() * 100; return randomDouble100 < percent; }; const spliceByName = (battlers, name) => { for (let i = 0; i < battlers.length; i++) { if (battlers[i].name === name) { battlers.splice(i, 1); return; } } }; const battlerOfName = (battlers, name) => { for (const battler of battlers) { if (battler.name === name) { return battler; } } }; const getRanking = battlers => { const battlersCopy = JSON.parse(JSON.stringify(battlers)); return battlersCopy.sort((a, b) => { if (a.accuracy < b.accuracy) { /* aはbより弱い */ return 1; } else { /* aはbより強い */ return -1; } }); }; const getMyRank = (battlers, myName) => { const ranking = getRanking(battlers); for (let i = 0; i < ranking.length; i++) { if (ranking[i].name === myName) { return i + 1; } } }; const iAmWorst = (battlers, myName) => { const myRank = getMyRank(battlers, myName); return myRank === battlers.length; }; const thinkAndDoCommand = (battlers, myName) => { // 3人のうち自分が最弱である場合パスする if (3 === battlers.length) { /* 3人とも健在である */ if (iAmWorst(battlers, myName)) { /* 自分が最弱である */ // パスする return; } } if (1 === battlers.length) { /* 既に自分1人 */ // パスする return; } /* 現在3人未満または自分が最弱でない */ // ランキング取得 const ranking = getRanking(battlers); // 攻撃相手選定 let target; if (ranking[0].name === myName) { /* 自分が最強である */ // 攻撃相手は二番手 target = ranking[1]; } else { /* 自分が最強でない */ // 攻撃相手は最強 target = ranking[0]; } // 自分を取得 const my = battlerOfName(battlers, myName); // 攻撃 if (nPercentProbability(my.accuracy)) { /* 当たった */ // 相手を消す spliceByName(battlers, target.name); } else { /* 外れた */ /* DO NOTHING */ } }; // accuracyは0-100[%] const createBattler = (name, accuracy) => { return { name, accuracy }; }; const createBattlers = myAccuracy => { const battlers = []; battlers.push(createBattler('a', myAccuracy)); battlers.push(createBattler('b', 70)); battlers.push(createBattler('c', 90)); return battlers; }; const doSimulation = (myAccuracy, firstCommandIsPass) => { // 自分はa const battlers = createBattlers(myAccuracy); // シミュレーション開始 while (true) { for (const battler of battlers) { // 初手パス判定 if (battler.name === 'a' && battlers.length === 3 && firstCommandIsPass) { continue; } thinkAndDoCommand(battlers, battler.name); } if (battlers.length === 1) { /* 最後の一人になった */ break; } } // 勝者を返却する return battlers[0]; }; const run = (myAccuracy, firstCommandIsPass, times) => { // スコアボード const score = { a: 0, b: 0, c: 0 }; // 試行 for (let i = 0; i < times; i++) { const winner = doSimulation(myAccuracy, firstCommandIsPass); score[winner.name]++; } // 結果 p(`確率:${myAccuracy},初手をパスする:${firstCommandIsPass},試行回数:${times}`); p(`aの勝率:` + (score.a * 100.0) / times + '%'); p(`bの勝率:` + (score.b * 100.0) / times + '%'); p(`cの勝率:` + (score.c * 100.0) / times + '%'); }; exports.run = run; |
1 2 3 4 |
確率:60,初手をパスする:true,試行回数:10000 aの勝率:66.49% bの勝率:23.27% cの勝率:10.24% |