/** * St. Petersburg paradox * by Kazuki Maeda * Last-Modified: Jul. 24, 2019 */ var mode = '' var numflip = 0; var thread; var prize = 0; var numendless = 0; var stat; var fliptext; window.onload = function(){ document.getElementById('flip').addEventListener('click', flip, true); document.getElementById('challenges').addEventListener('click', challenges, true); document.getElementById('endless').addEventListener('click', endless, true); } function flip(){ if(mode != 'flip'){ if(mode != 'flipcontinue'){ historytext = ''; } document.getElementById('result').innerHTML = ''; mode = 'flip'; numflip = 0; fliptext = ''; } var r = Math.floor(Math.random()*2); var addhistoryflag = false; var rchar; if(r){ fliptext += '○ '; ++numflip; } else { fliptext += '×:' + Math.pow(2, numflip) + '円獲得!!'; addhistoryflag = true; mode = 'flipcontinue'; } document.getElementById('result').innerHTML = fliptext + '
履歴:
' + historytext; if(addhistoryflag) historytext = fliptext + '
' + historytext; } function addstat(stat, n){ if(typeof stat[n] === 'undefined') stat[n] = 1; else ++stat[n]; } function challenges(){ mode = 'challenges'; var numchallenges = Math.floor(document.getElementById('numchallenges').value); prize = 0; var restext = ''; var stat = []; document.getElementById('result').innerHTML = ''; for(var k = 0; k < numchallenges; ++k){ numflip = 0; while(1){ var r = Math.floor(Math.random()*2); var rchar; if(r){ restext += '○ '; ++numflip; } else { addstat(stat, numflip); var t = Math.pow(2, numflip); restext += '×:' + t + '円獲得!!
'; prize += t; } if(!r) break; } } document.getElementById('result').innerHTML = numchallenges.toFixed() + '回挑戦した結果,合計獲得金額:' + prize.toFixed() + '円!! 1回の平均獲得金額:' + (prize/numchallenges) + '円!!
'; for(var k = 0; k < stat.length; ++k){ document.getElementById('result').innerHTML += '2' + k + '=' + Math.pow(2, k) + '円獲得回数:'; var t; if(typeof stat[k] === 'undefined') t = 0; else t = stat[k]; document.getElementById('result').innerHTML += t + '回(' + (t/numchallenges*100) + '%)
'; } document.getElementById('result').innerHTML += '
履歴:
'; document.getElementById('result').innerHTML += restext; } function endless(){ if(mode != 'endless'){ if(mode != 'inendless'){ prize = 0; numendless = 0; stat = []; } mode = 'endless'; thread = setInterval("endlessupdate();", 1000/60); document.getElementById('flip').disabled = true; document.getElementById('challenges').disabled = true; document.getElementById('endless').value = 'もう飽きた'; } else { mode = 'inendless'; document.getElementById('flip').disabled = false; document.getElementById('challenges').disabled = false; document.getElementById('endless').value = '飽きるまで挑戦し続ける'; clearInterval(thread); } } function endlessupdate(){ var speed = Math.floor(document.getElementById('speed').value); speed = speed <= 0 ? 1 : speed; for(var k = 0; k < speed; ++k){ ++numendless; numflip = 0; while(1){ var r = Math.floor(Math.random()*2); if(r){ ++numflip; } else { addstat(stat, numflip); prize += Math.pow(2, numflip); } if(!r) break; } } document.getElementById('result').innerHTML = numendless.toFixed() + '回挑戦した結果,合計獲得金額:' + prize.toFixed() + '円!! 1回の平均獲得金額:' + (prize/numendless).toFixed(16) + '円!!
'; for(var k = 0; k < stat.length; ++k){ document.getElementById('result').innerHTML += '2' + k + '=' + Math.pow(2, k) + '円獲得回数:'; var t; if(typeof stat[k] === 'undefined') t = 0; else t = stat[k]; document.getElementById('result').innerHTML += t + '回(' + (t/numendless*100).toFixed(16) + '%)
'; } }