Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Generate histograms based on "dice" rolls. The rolls are actually random numbers generated by random.org. Supports summing groups of dice per roll.
# This code will produce two histograms based on NUMBER_OF_ROLLS
# "dice" rolls. The rolls are actually random numbers generated
# by random.org.
#
# If the NUMBER_OF_DICE is greater than one, dice will be "rolled"
# in groups of that number NUMBER_OF_ROLLS times.
#
# This is free and unencumbered software released into the public domain.
# See: http://unlicense.org for license details.
#
# Written by Kyle Geske (@stungeye) December 2013
NUMBER_OF_DICE = 3
NUMBER_OF_ROLLS = 80
# Draws an ASCII histogram of an array of dice rolls/sums.
def histogram(args)
min_roll = args[:number_of_dice]
max_roll = args[:number_of_dice] * args[:dice_sides]
# Count duplicates in the dice rolls array using a hash.
histo_hash = args[:dice_rolls].each_with_object(Hash.new(0)) { |o, h| h[o] += 1 }
(min_roll..max_roll).each {|i| puts "#{i.to_s.ljust(2)} #{'*' * histo_hash[i]}" }
end
# Load all the random.org random numbers, remove newline characters, convert to ints.
total_rolls = IO.readlines('./rolls.txt').map { |e| e.chomp.to_i }
# Create a random range from the random.org dataset of size NUMBER_OF_DICE * NUMBER_OF_ROLLS.
starting_position = rand(0...total_rolls.size-NUMBER_OF_ROLLS)
random_range = (starting_position...starting_position+(NUMBER_OF_DICE*NUMBER_OF_ROLLS))
# Sum the rolls in groups of NUMBER_OF_DICE.
roll_sums = []
total_rolls[random_range].each_slice(NUMBER_OF_DICE) {|group| roll_sums << group.inject(&:+) }
puts "Histogram across #{NUMBER_OF_DICE * NUMBER_OF_ROLLS} dice rolls:"
histogram(dice_rolls: total_rolls[random_range], number_of_dice: 1, dice_sides: 6)
puts "\nHistogram of #{NUMBER_OF_ROLLS} dice sums in groups of #{NUMBER_OF_DICE}:"
histogram(dice_rolls: roll_sums, number_of_dice: NUMBER_OF_DICE, dice_sides: 6)
5
6
6
3
6
2
3
3
2
5
3
2
6
2
4
3
1
5
1
2
3
5
5
3
5
2
1
2
3
1
5
6
4
3
6
2
1
3
2
5
4
2
4
2
6
5
4
2
5
5
3
2
3
6
6
2
4
2
3
5
6
5
2
4
2
5
4
6
3
6
5
6
2
4
6
1
1
4
2
4
4
4
4
2
4
5
6
2
4
5
6
1
6
6
4
5
1
3
6
5
1
3
2
4
1
2
5
5
5
4
1
3
4
1
1
5
3
1
2
5
3
3
4
3
2
6
6
4
2
6
1
6
1
2
6
2
3
3
1
1
4
3
4
1
5
1
6
3
1
2
3
2
5
6
6
3
2
4
3
3
3
4
3
3
4
3
4
3
2
2
1
4
5
6
4
2
3
4
1
2
4
2
1
6
5
5
6
3
4
5
2
5
3
2
3
1
2
6
1
5
6
2
4
2
4
2
6
2
5
4
2
6
3
1
1
6
2
3
2
4
5
1
2
6
1
5
2
6
2
3
3
5
2
6
3
2
2
6
2
2
4
2
5
2
2
4
5
6
1
2
6
6
5
4
5
4
1
6
2
4
6
1
2
6
4
3
4
6
2
5
4
6
5
5
6
6
3
2
1
3
6
2
3
5
3
3
1
5
3
5
2
2
1
4
4
2
5
3
2
5
1
6
6
6
5
5
1
6
1
5
6
6
6
4
1
6
5
6
4
5
3
5
5
3
5
4
6
6
4
4
6
5
5
4
6
6
3
3
5
2
2
3
1
4
3
5
3
1
6
3
2
4
2
3
2
2
5
4
2
3
2
5
2
3
6
1
6
2
4
3
4
1
1
3
4
4
5
4
4
5
5
2
5
6
6
2
3
3
3
3
4
5
3
6
5
3
6
1
4
5
4
6
3
1
5
6
5
4
4
5
2
3
5
2
5
3
1
2
5
5
6
5
6
1
6
1
4
5
6
4
6
3
4
3
2
6
2
2
4
1
3
5
5
6
5
3
1
2
1
2
4
3
1
6
4
1
3
5
6
2
4
2
6
6
5
2
1
2
5
6
5
6
5
1
5
4
2
5
4
6
5
4
2
1
3
4
2
4
2
4
1
6
4
2
2
2
4
1
1
2
2
5
2
3
2
2
4
1
3
3
5
6
6
6
4
6
2
3
2
3
2
2
3
6
4
4
1
2
1
1
6
6
4
2
5
1
5
5
1
1
6
2
4
6
2
6
1
3
3
3
6
1
4
4
2
1
5
4
3
2
2
2
5
2
5
4
2
2
4
6
5
3
1
1
3
3
5
5
6
5
2
1
5
2
3
3
1
5
3
3
6
5
1
3
3
5
5
6
6
2
1
4
6
2
1
2
1
4
3
3
1
5
5
2
5
5
4
4
6
2
3
5
1
2
3
3
6
1
1
6
1
6
3
4
6
1
6
5
4
4
4
1
2
3
1
4
6
5
6
1
6
2
4
2
6
3
3
5
6
6
6
6
5
6
3
5
3
3
3
6
3
1
4
3
6
1
4
5
4
5
1
2
6
2
3
4
4
2
3
3
3
1
3
6
3
2
6
3
4
1
5
6
1
4
6
5
1
5
2
6
5
3
3
2
4
3
3
2
4
2
3
1
1
4
1
1
2
4
6
4
2
3
1
5
6
4
4
1
3
4
5
6
6
3
1
4
2
3
4
2
2
3
2
6
1
6
6
4
5
4
3
2
1
1
3
5
5
4
5
5
6
1
1
4
2
5
4
2
6
6
3
2
4
6
1
3
6
4
2
1
3
3
4
6
5
3
3
1
5
5
2
2
6
5
4
4
2
3
6
6
4
1
5
2
2
1
1
5
1
2
6
6
1
4
1
3
4
3
1
2
2
3
4
6
4
2
1
6
3
1
3
1
4
6
3
4
6
3
3
1
3
4
3
6
6
1
3
5
3
5
1
1
4
1
5
2
4
6
4
4
5
3
4
5
3
5
6
4
5
5
3
1
6
2
6
5
1
2
5
6
2
5
2
5
4
6
4
6
1
6
4
1
3
3
4
4
3
5
2
5
1
4
4
5
6
2
6
4
2
1
1
5
2
2
4
3
3
2
6
6
4
5
1
3
5
2
4
2
6
2
3
1
2
3
1
6
1
3
6
2
3
3
3
1
4
5
5
1
4
5
6
1
4
1
2
2
5
1
6
3
3
5
3
5
5
1
3
5
3
3
3
5
4
5
6
3
2
5
1
2
4
3
6
3
6
5
6
5
5
1
5
5
6
2
3
3
1
4
6
2
1
5
6
4
4
4
1
6
3
4
6
4
2
2
5
3
6
3
2
2
2
1
5
5
5
5
5
2
5
2
4
5
2
3
3
5
5
4
2
6
5
6
3
4
4
2
4
4
6
6
5
2
3
5
4
4
5
6
4
6
4
6
2
6
4
2
3
1
6
4
4
6
2
6
4
2
6
6
3
6
4
1
4
6
1
1
4
2
1
6
3
4
5
2
1
6
6
5
5
5
3
1
5
6
2
3
5
3
6
4
1
3
4
5
1
6
6
5
3
3
2
3
4
2
6
4
1
4
6
6
6
6
5
3
3
6
4
4
1
3
2
2
5
2
1
3
5
4
3
1
1
3
2
2
6
4
5
1
5
1
5
4
1
5
4
4
5
2
4
1
3
3
5
1
2
1
5
6
3
3
3
3
4
2
3
3
1
2
1
1
5
3
1
6
5
1
2
5
3
5
1
5
3
2
5
1
3
3
6
5
4
4
1
2
2
1
5
2
6
1
4
5
4
1
2
3
5
1
2
2
3
4
1
5
4
4
5
3
6
6
3
4
5
2
5
5
4
6
6
6
6
6
2
2
5
2
1
4
3
4
1
1
6
2
2
6
6
3
5
1
1
5
2
5
3
3
1
4
2
6
3
2
3
5
3
4
2
3
3
4
6
5
1
1
6
1
4
3
1
6
3
1
1
1
6
2
5
4
1
2
4
6
3
2
4
3
6
1
1
6
3
3
3
3
2
6
2
6
4
3
6
3
1
4
3
1
5
3
5
2
5
3
6
5
6
1
1
1
2
5
4
5
6
3
2
5
2
5
4
1
4
5
4
1
1
4
5
5
4
5
6
1
1
6
1
5
1
6
2
1
6
5
3
3
2
2
1
1
4
2
4
3
4
1
3
2
3
6
4
6
3
6
4
1
2
5
1
1
5
6
6
4
3
1
1
4
4
2
2
3
6
2
6
6
4
3
6
5
6
4
4
5
2
1
2
5
1
3
5
6
2
4
3
6
1
2
6
2
2
2
3
6
5
6
2
3
1
1
3
3
2
2
4
2
3
1
4
4
6
2
2
1
5
1
2
2
3
6
6
5
3
3
3
1
5
2
2
1
2
5
5
1
1
1
1
4
6
2
1
4
5
6
5
2
5
1
6
2
1
5
4
4
3
3
4
3
6
2
1
2
2
6
2
6
6
4
5
5
6
6
3
6
1
2
6
3
4
1
4
5
2
2
2
6
1
2
3
5
1
3
3
5
5
6
3
5
6
6
1
5
4
5
3
4
3
4
6
5
3
4
6
4
1
5
3
6
5
6
3
4
1
5
3
6
6
2
4
5
4
2
1
4
4
3
6
1
6
1
4
2
6
1
4
3
6
1
5
2
2
6
4
6
6
3
6
2
3
5
1
6
1
2
5
3
3
1
5
3
5
6
3
6
2
3
2
2
6
2
4
5
3
5
4
3
6
3
6
2
6
1
2
5
3
4
3
5
6
2
4
2
1
1
4
6
3
6
1
2
1
1
3
1
5
2
5
1
4
1
4
3
6
2
1
4
1
4
4
4
5
3
3
6
3
1
5
2
2
1
3
4
3
3
2
6
5
6
4
5
6
2
5
3
4
2
4
6
6
4
4
2
4
6
2
5
1
6
1
3
5
3
3
2
3
3
5
1
3
6
1
1
3
5
3
2
6
2
4
1
1
2
1
1
5
1
1
5
2
4
5
2
2
5
3
5
1
1
6
5
1
1
6
1
2
3
3
3
2
6
6
3
5
1
1
5
6
5
3
5
3
1
6
6
3
4
2
2
3
4
1
2
1
1
2
1
6
4
6
6
1
5
5
3
1
5
1
2
2
4
3
1
2
5
4
5
2
6
5
4
2
5
5
1
6
3
3
3
3
2
3
1
6
3
2
1
3
3
4
5
2
2
4
5
6
5
3
5
1
1
6
6
6
4
3
6
6
3
4
6
4
3
3
6
1
4
2
4
3
2
3
4
4
3
2
3
3
1
6
5
3
4
5
6
3
5
4
2
4
5
2
5
4
5
5
2
2
6
4
3
3
4
5
2
6
4
6
2
4
2
2
6
1
2
5
3
4
6
5
5
5
4
4
1
1
2
4
6
6
2
2
3
3
2
1
5
6
3
4
4
1
6
6
5
5
4
2
3
5
2
6
3
5
2
6
3
4
6
4
3
4
4
4
2
1
3
4
1
2
2
1
3
6
2
6
5
1
1
5
2
2
5
3
2
3
4
4
1
2
2
4
4
3
3
3
5
4
1
1
6
3
4
5
1
1
2
4
2
2
3
3
4
1
1
3
4
3
6
2
5
4
1
1
5
5
3
1
4
6
6
2
2
4
4
5
6
2
5
4
2
5
2
6
6
1
4
6
6
4
4
5
3
4
6
2
5
5
6
3
1
1
6
1
2
4
5
2
1
6
1
2
6
2
2
2
3
6
2
3
3
5
4
3
6
1
6
3
3
2
6
2
2
2
1
4
6
2
3
2
5
5
2
2
2
6
5
3
3
1
2
3
2
2
2
3
1
2
4
4
3
4
6
6
4
4
4
1
2
1
5
5
4
6
3
4
5
5
3
1
3
4
2
3
4
1
6
2
4
2
6
2
5
1
1
6
5
6
4
5
6
6
2
1
1
2
2
2
3
2
3
4
5
5
6
6
6
1
2
6
1
2
4
5
4
2
6
2
5
4
3
6
5
3
5
1
4
5
1
4
1
4
1
3
3
3
4
1
4
2
1
1
1
6
5
3
2
1
3
2
3
4
3
5
2
3
1
2
6
5
5
5
2
4
1
6
6
2
4
6
4
4
5
2
1
6
6
3
2
3
1
2
2
3
3
2
4
1
1
3
1
5
6
6
2
5
5
6
4
6
3
3
2
4
6
6
2
5
3
5
3
5
4
2
6
5
3
1
3
1
4
6
4
6
4
4
2
1
1
1
2
2
3
3
3
4
5
1
5
6
4
3
3
1
1
5
3
1
6
4
1
3
2
1
5
6
3
6
4
2
2
4
2
3
5
4
3
2
5
4
5
6
3
3
3
4
1
4
6
2
3
1
4
4
2
2
5
1
2
6
3
5
2
6
2
5
6
5
5
2
2
2
5
4
1
1
4
6
1
4
5
5
5
2
4
1
3
6
4
3
2
3
3
4
2
3
2
2
5
1
3
4
5
5
3
3
6
3
5
6
4
1
2
2
2
4
5
6
4
5
1
6
4
5
6
4
4
1
1
5
5
3
1
5
1
4
1
3
2
4
1
1
1
3
1
4
3
4
1
1
4
4
2
4
2
3
4
6
4
5
6
5
3
6
5
2
4
5
3
3
3
1
6
5
1
6
1
5
2
3
6
2
4
6
2
2
2
5
6
4
2
2
1
4
5
2
2
1
1
1
5
5
6
3
6
6
3
4
2
5
6
2
4
2
2
3
3
6
3
5
4
2
5
3
1
4
2
4
3
3
5
5
1
6
4
3
1
5
2
2
2
5
1
6
3
3
1
4
1
3
6
2
1
1
2
4
5
6
1
5
4
4
4
1
2
6
6
4
3
3
3
4
4
3
1
2
5
3
4
6
1
5
4
2
2
6
3
6
3
6
5
1
5
2
3
5
4
5
4
6
2
4
6
3
2
3
4
2
3
4
6
6
3
3
5
5
4
3
2
3
6
1
4
1
1
4
2
4
6
4
1
4
2
6
6
2
2
1
1
2
4
6
6
2
1
1
5
3
6
2
4
1
2
1
1
2
3
5
1
3
5
3
3
1
2
2
3
5
6
3
5
2
6
3
6
2
1
3
6
1
6
5
6
5
6
3
3
3
6
4
2
1
3
1
1
4
1
1
2
4
5
4
3
6
5
3
3
1
6
2
5
4
2
4
3
4
2
2
2
6
5
6
5
4
3
5
5
4
3
5
2
1
6
2
5
2
1
6
4
2
2
2
4
2
2
5
3
2
3
5
4
3
4
2
5
3
3
3
1
5
5
4
4
1
3
4
1
5
5
4
4
4
6
5
4
2
1
5
6
6
6
3
5
5
6
1
1
1
2
5
6
1
3
3
3
3
1
5
5
3
5
3
6
4
5
2
1
3
5
4
4
4
5
4
3
3
4
4
6
6
2
3
6
4
1
3
2
4
3
4
4
6
5
5
1
3
2
2
1
6
3
5
1
2
1
5
6
6
5
3
4
4
1
3
3
3
6
5
1
5
3
4
4
4
2
1
2
2
4
1
6
2
3
5
2
5
3
3
1
5
6
5
3
6
3
2
5
1
5
2
3
3
3
4
1
1
6
1
2
1
3
3
2
5
2
3
5
3
4
5
4
1
5
2
5
2
5
4
3
4
1
5
3
6
2
3
5
1
3
3
6
5
1
5
4
5
6
4
5
6
1
4
2
1
5
2
1
6
4
1
5
4
6
5
6
1
6
1
5
6
1
1
3
1
1
3
4
5
4
3
4
3
1
4
6
6
3
1
2
2
2
4
4
6
1
6
2
4
5
2
1
2
5
3
1
4
1
4
2
3
5
1
4
5
2
2
6
4
4
4
3
6
5
2
4
5
5
4
6
5
3
1
6
4
5
4
2
5
6
4
4
5
2
4
5
2
3
5
6
6
6
4
5
4
1
6
3
5
2
4
5
4
5
6
4
4
6
5
2
4
1
3
4
5
3
1
4
2
5
2
3
2
3
3
5
1
4
5
2
3
6
5
3
4
5
3
3
5
6
4
2
3
5
6
1
1
1
6
2
3
5
1
4
3
4
1
1
1
5
5
4
4
1
1
1
3
2
4
5
4
2
4
6
5
6
4
1
5
6
6
1
6
2
3
3
2
6
5
1
3
2
6
2
5
1
2
4
5
2
4
3
3
1
5
6
6
2
1
5
6
4
2
3
4
3
2
3
5
2
5
1
4
1
5
2
3
6
2
2
3
1
6
5
4
5
5
5
6
2
5
5
5
4
2
6
6
2
5
1
1
1
3
6
1
2
6
4
5
2
3
2
4
6
5
5
5
5
5
4
5
6
4
3
3
6
2
6
3
1
6
6
2
1
6
6
2
5
6
6
2
6
6
6
3
6
6
1
6
5
1
6
2
5
4
4
1
3
5
3
4
5
1
4
3
4
6
6
6
2
6
1
6
5
3
2
4
2
6
4
6
4
2
1
6
4
5
6
1
4
4
4
4
2
6
1
2
1
6
1
1
6
5
2
3
1
3
5
5
3
1
1
5
5
6
3
1
3
1
4
5
1
4
4
6
1
5
2
2
3
5
3
6
6
5
3
3
5
2
3
2
1
5
4
3
6
2
2
1
1
3
6
4
6
5
3
5
4
4
2
2
5
6
5
2
2
2
2
4
1
5
6
6
3
1
1
5
1
2
6
6
2
5
5
5
3
6
1
2
4
3
5
4
1
4
3
5
5
3
4
3
2
6
2
1
3
3
5
3
3
4
4
2
5
3
1
4
6
1
2
2
4
3
4
6
6
1
4
5
2
1
3
5
4
2
6
5
5
4
1
6
5
5
6
2
1
1
4
1
6
3
5
4
2
1
2
2
3
3
3
4
4
3
6
3
3
6
2
1
4
6
4
4
1
4
6
4
3
1
6
4
3
3
3
2
2
1
4
5
3
5
1
4
1
2
4
1
4
2
3
4
4
2
3
5
6
2
4
5
5
2
2
4
4
1
6
2
5
3
2
3
3
5
5
5
3
5
1
1
2
2
2
6
4
2
4
2
5
2
1
4
3
1
4
5
5
6
5
2
6
3
1
6
1
2
5
6
6
6
2
5
6
6
4
1
1
1
2
1
3
6
4
6
6
5
3
6
5
2
5
4
2
4
2
3
6
2
1
1
6
6
3
6
4
1
2
4
5
5
2
3
5
2
4
5
3
1
3
3
3
4
6
5
1
2
1
5
6
5
1
4
4
3
6
5
2
3
2
1
4
2
5
5
3
5
4
5
5
3
1
5
4
4
6
2
3
1
3
6
6
5
4
5
2
4
2
1
1
2
1
6
3
4
6
2
1
3
4
4
1
1
6
3
5
2
1
3
5
6
4
3
2
6
2
2
5
1
4
3
4
3
5
4
3
4
4
2
4
4
6
2
2
3
2
3
6
3
4
4
6
1
1
6
5
5
6
6
2
3
3
6
3
3
5
4
3
2
6
1
5
1
3
6
2
4
5
4
5
1
2
4
2
4
2
4
4
2
4
2
4
1
3
2
2
4
4
5
5
4
3
4
6
6
1
6
6
3
6
4
4
5
2
2
4
2
2
1
4
2
6
3
6
4
2
4
3
3
6
4
5
1
4
6
4
3
2
1
3
1
5
1
3
2
6
3
4
5
2
3
4
6
2
6
3
2
4
6
5
5
1
6
5
2
5
2
5
5
1
6
4
3
5
3
5
6
3
4
2
1
1
1
5
3
6
5
5
4
2
5
3
4
2
4
3
5
3
3
3
2
4
5
4
3
6
2
6
3
2
4
6
5
5
6
2
5
1
3
6
3
2
5
4
1
5
2
2
6
1
4
1
4
5
2
4
5
1
2
3
1
6
1
6
2
4
2
3
5
6
4
4
3
3
3
3
5
5
6
2
2
4
4
4
6
4
1
5
4
5
1
4
3
6
4
2
5
4
1
3
4
3
5
2
4
4
3
2
6
6
3
4
4
6
3
5
1
4
6
1
1
5
6
2
6
5
1
4
2
6
2
5
5
4
1
6
1
6
5
1
2
2
2
6
5
4
2
6
3
3
5
1
2
6
3
6
4
4
2
3
4
3
1
2
3
1
3
5
3
6
4
1
4
3
2
4
6
2
6
3
2
1
3
6
3
2
5
3
6
1
1
5
4
2
3
1
5
6
2
2
6
5
4
3
6
2
2
2
6
3
6
6
6
5
5
3
6
5
2
6
3
2
6
5
4
4
3
6
1
4
4
1
6
1
3
3
6
1
2
3
6
1
3
6
2
1
1
6
3
6
2
1
4
4
2
2
5
4
3
1
3
1
2
3
3
1
4
1
5
5
6
3
5
3
3
6
4
3
1
4
4
2
6
4
5
1
2
5
6
1
5
3
5
4
5
2
2
5
1
5
2
5
6
2
1
1
2
1
6
6
3
4
4
3
1
6
4
3
2
4
3
1
2
1
2
6
6
4
3
6
5
4
3
5
3
3
6
3
4
2
3
1
6
5
4
1
4
1
2
6
2
2
4
3
6
4
6
1
3
2
3
5
4
6
4
4
4
3
1
1
5
2
6
3
5
4
4
6
1
3
1
3
5
5
6
1
3
5
2
2
5
6
3
4
2
2
5
1
1
5
6
6
6
2
1
5
6
4
2
1
6
5
4
2
6
5
2
2
2
5
6
2
3
1
3
5
3
4
4
6
6
4
3
1
1
5
6
1
5
5
1
5
1
2
4
6
6
4
2
6
3
6
6
3
6
5
2
4
3
1
4
4
5
6
3
1
2
3
5
3
3
1
4
4
3
5
2
3
5
5
3
6
2
1
3
5
6
2
2
2
2
6
2
4
5
5
5
3
1
6
3
3
3
2
4
5
5
1
2
1
5
3
6
5
3
5
4
2
5
3
4
4
2
6
4
6
2
2
3
3
3
5
6
5
2
1
3
3
6
6
5
1
4
6
6
4
1
1
4
4
3
2
3
6
5
1
6
1
6
3
5
5
6
5
1
6
1
3
6
2
5
1
1
3
5
5
1
4
4
1
2
2
1
3
6
3
3
5
1
6
3
1
3
3
5
2
3
4
1
6
2
1
3
3
6
1
5
2
1
6
6
5
1
4
3
4
4
1
2
5
2
6
5
4
6
6
1
4
5
1
5
3
4
3
2
4
3
5
6
1
5
1
2
4
1
6
6
3
2
3
1
6
5
4
2
6
6
1
3
5
4
1
5
6
1
2
2
4
2
5
6
4
6
3
3
6
6
1
6
5