Created
August 10, 2025 21:38
-
-
Save Krinkle/342cef278a384948c5ac7430864a3d6e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! | |
* Usage: | |
* $ node montehall.js | |
* $ DEBUG=1 node montehall.js | |
* | |
* changeYourMind=true | |
* | |
* $ node montehall.js | grep won | wc -l | |
* ~660 | |
* | |
* changeYourMind=false | |
* | |
* $ node montehall.js | grep won | wc -l | |
* ~330 | |
*/ | |
const util = require('util'); | |
const DEBUG = process.env.DEBUG; | |
function getRandomInt(max) { | |
return 1 + Math.floor(Math.random() * max); | |
} | |
function getRandomValue(list) { | |
return list[Math.floor(Math.random() * list.length)]; | |
} | |
function debug(msg) { | |
if (DEBUG) { | |
console.log(util.styleText('grey', msg)); | |
}; | |
} | |
/** | |
* @param {bool} changeYourMind | |
*/ | |
function playMonteHall(changeYourMind) { | |
var doors = [ '#1', '#2' ,'#3' ]; | |
var secret = getRandomValue(doors); | |
var choice = getRandomValue(doors); | |
console.log('You choose door ' + choice); | |
debug('... prize is behind ' + secret); | |
var allGoats = doors.filter(value => value !== secret); | |
debug('... all goats: ' + allGoats); | |
var remainingGoats = allGoats.filter(value => value !== choice); | |
debug('... remaining goats: ' + remainingGoats); | |
var shownGoat = getRandomValue(remainingGoats); | |
console.log('Goat behind door ' + shownGoat); | |
var remainingDoor = doors.filter(value => value !== choice && value !== shownGoat)[0]; | |
console.log('Do you want to change to door ' + remainingDoor + '?'); | |
if (!changeYourMind) { | |
console.log('[STICK]', | |
secret === choice | |
? util.styleText('green', 'You won!') | |
: util.styleText('red', `You lost, it was door ${secret}.`) | |
); | |
} else { | |
var newChoice = remainingDoor; | |
console.log('[CHANGE]', | |
secret === newChoice | |
? util.styleText('green', 'You won!') | |
: util.styleText('red', `You lost, it was door ${secret}.`) | |
); | |
} | |
} | |
var i = 1000; | |
while (i--) { | |
playMonteHall(true); | |
} | |
/* | |
# START | |
3 starting layouts | |
[ π ] [ π ] [ π ] | |
[ π ] [ π ] [ π ] | |
[ π ] [ π ] [ π ] | |
3 starting choices | |
[ πΉ] [ ] [ ] | |
[ ] [ πΉ ] [ ] | |
[ ] [ ] [ πΉ] | |
9 starting scenarios | |
[ ππΉ] [ π ] [ π ] | |
[ π ] [ ππΉ] [ π ] | |
[ π ] [ π ] [ ππΉ] | |
[ ππΉ] [ π ] [ π ] | |
[ π ] [ ππΉ] [ π ] | |
[ π ] [ π ] [ ππΉ] | |
[ ππΉ] [ π ] [ π ] | |
[ π ] [ ππΉ] [ π ] | |
[ π ] [ π ] [ ππΉ] | |
Chance of win: | |
3 in 9 | |
= 1 in 3 | |
= 33% | |
--------- | |
# THE GOAT | |
9 starting scenarios show you the one or two remaining goats (not prize, not choice) | |
[ ππΉ] [ π ] [ π ] | |
[ ππΉ] [ πβ] [ π2οΈβ£] | |
[ ππΉ] [ π2οΈβ£] [ πβ] | |
[ π ] [ ππΉ] [ π ] | |
[ π2οΈβ£] [ ππΉ] [ πβ] | |
[ π2οΈβ£] [ ππΉ] [ πβ] | |
[ π ] [ π ] [ ππΉ] | |
[ π2οΈβ£] [ πβ] [ ππΉ] | |
[ π2οΈβ£] [ πβ] [ ππΉ] | |
[ ππΉ] [ π ] [ π ] | |
[ ππΉ] [ π2οΈβ£] [ πβ] | |
[ ππΉ] [ π2οΈβ£] [ πβ] | |
[ π ] [ ππΉ] [ π ] | |
[ π2οΈβ£] [ ππΉ] [ πβ] | |
[ πβ] [ ππΉ] [ π2οΈβ£] | |
[ π ] [ π ] [ ππΉ] | |
[ πβ] [ π2οΈβ£] [ ππΉ] | |
[ πβ] [ π2οΈβ£] [ ππΉ] | |
[ ππΉ] [ π ] [ π ] | |
[ ππΉ] [ πβ] [ π2οΈβ£] | |
[ ππΉ] [ πβ] [ π2οΈβ£] | |
[ π ] [ ππΉ] [ π ] | |
[ πβ] [ ππΉ] [ π2οΈβ£] | |
[ πβ] [ ππΉ] [ π2οΈβ£] | |
[ π ] [ π ] [ ππΉ] | |
[ πβ] [ π2οΈβ£] [ ππΉ] | |
[ π2οΈβ£] [ πβ] [ ππΉ] | |
18 choices: | |
* 6 in 18: on the prize, change to goat | |
* 12 in 18: on the goat, change to prize | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment