A Ruby Monte Carlo simulation of coin flips

For some reason or another today I was curious about this question: If you flipped a coin ten times, what are the odds that the coin would come up heads ten times, or tails ten times)?

I'm sure there is a way to determine this statistically, but I don’t know how to do that, so, being new to Ruby, I wrote a little Ruby simulation program — essentially a Monte Carlo simulation of the problem — to find the answer.

Example Ruby “Monte Carlo simulation” program

Without any further ado, here is the example Ruby program I wrote to simulate this problem:

# my ruby random method, with an intentionally short name
def r
  rand(2)
end

# if all elements in the array "a" are the same, return true
def all_equal a
    a[0] == a[1] and 
    a[0] == a[2] and
    a[0] == a[3] and
    a[0] == a[4] and
    a[0] == a[5] and
    a[0] == a[6] and
    a[0] == a[7] and
    a[0] == a[8] and
    a[0] == a[9]
end

# out of the array, determine the number of elements that match "num"
def get_count arr, num
    count = 0
    arr.each do |a|
        if a == num then
            count = count + 1
        end
    end
    return count
end

#------#
# main #
#------#
num_all_equal = 0.0
num_heads = 0
num_tails = 0
tot_count = 250000
tot_count.times {
    flips = [r,r,r,r,r,r,r,r,r,r]
    #puts flips.inspect
    if all_equal(flips) then 
        num_all_equal = num_all_equal + 1
    end
    num_heads = num_heads + get_count(flips, 0)
    num_tails = num_tails + get_count(flips, 1)
}
pct_all_equal = num_all_equal/tot_count*100.0
puts "num where all were the same: #{num_all_equal}"
puts "all sides were equal #{pct_all_equal}% of the time"
puts "#heads: #{num_heads}"
puts "#tails: #{num_tails}"

It’s worth noting that my Ruby get_count method and the last few lines of the program are not necessary. I just put them in there to be sure I was getting a relatively even spread between heads (the number 0) and tails (the number 1) in my Monte Carlo simulation.

Finally, here is some example output from the program:

num where all were the same: 513.0
all sides were equal 0.2052% of the time
#heads: 1249227
#tails: 1250773

Of course the actual numbers change a little with each simulation, but that’s an example of the output I get with the simulation.