redballs.frink

Download or view redballs.frink in plain text format


/** 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]


Download or view redballs.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 20145 days, 6 hours, 16 minutes ago.