/** Probabilistic solver for a logic puzzle:
https://www.quantamagazine.org/perplexing-the-web-one-probability-puzzle-at-a-time-20240829/
"You have an urn filled with 100 balls, some red and some green. You can’t
see inside; all you know is that someone determined the number of red balls
by picking a number between zero and 100 from a hat. You reach into the urn
and pull out a ball. It’s red. If you now pull out a second ball, is it
more likely to be red or green (or are the two colors equally likely)?"
*/
trials = million
redFirstTrials = 0 // Number of trials in which the first ball drawn is red
redSecond = 0 // Number of trials in which the second ball drawn is red
for trial = 1 to trials
{
numRed = random[0, 100]
// Create an array of 100 balls which are either "red" or "green" with the
// number of red given by numRed
urn = new array[[100], {|x, data| x < data ? "red" : "green"}, numRed]
urn.shuffle[] // To eliminate any bias, shuffle using Fisher-Yates-Knuth
firstBall = urn.removeRandom[] // Draw a random first ball, removing it
if firstBall == "red"
{
// First ball was red
redFirstTrials = redFirstTrials + 1
secondBall = urn.removeRandom[] // Draw a random second ball
if secondBall == "red"
redSecond = redSecond + 1
}
}
// Calculate the ratio of second balls that are also red
println["The probability that the second ball is also red:"]
println[redSecond / redFirstTrials]