/**
* 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) + '%)
';
}
}