JSFiddle - React, Tailwind, and code Playground
JavaScript
var HEADS = 0;
var TAILS = 1;
var DOUBLE_HEADED_COIN_INDEX = 35; // Arbitrary.
var NUM_COINS = 1000;
// Draws a coin out of NUM_COINS uniformly and returns its index.
function pickCoin() {
// Pick a coin.
return Math.floor(Math.random() * NUM_COINS);
}
function tossCoin(coinIndex) {
if (coinIndex == DOUBLE_HEADED_COIN_INDEX) {
return HEADS;
}
return (Math.random() >= 0.5) ? HEADS : TAILS;
}
// Returns the number of heads seen until tails is seen, up to
// maxHeads.
function tossUntilTails(coinIndex, maxHeads) {
var numHeads = 0;
while (numHeads < maxHeads) {
if (tossCoin(coinIndex) == TAILS) {
break;
}
++numHeads;
}
return numHeads;
}
function runSimulation(numIters) {
var numHeads = 0, numTails = 0;
for (var i = 0; i < numIters; i++) {
// Loop until we get 10 heads in a row.
var coinIndex;
while (true) {
coinIndex = pickCoin();
if (tossUntilTails(coinIndex, 10) == 10) {
break;
}
}
if (tossCoin(coinIndex) == HEADS) {
numHeads++;
} else {
numTails++;
}
}
var pHead = numHeads / (numHeads + numTails);
document.write("Got " + numHeads + " heads and " + numTails + " tails; " +
"p(HEAD) = " + pHead);
}
runSimulation(10000);