run multiple sessions to find out long term winnings

This commit is contained in:
Sami Samhuri 2011-12-23 21:12:34 -05:00
parent 69144a3a30
commit a7c33e4f06
2 changed files with 51 additions and 34 deletions

View file

@ -55,11 +55,18 @@ class Roulette
@sets[:z].insert(2, 5)
end
@rng = @options[:seed] ? Random.new(@options[:seed]) : Random.new
# generated numbers are from 0 to max
@max = @options[:style] == 'American' ? 38 : 37
total_per_number = 0
@net_profits = BettingSequence.map do |n|
total_per_number += n
36 * n - 7 * total_per_number
end
@snake_penalty = 7 * total_per_number
end
def simulate
@set_status = {}
Sets.keys.each do |key|
@set_status[key] = {
@ -71,19 +78,11 @@ class Roulette
}
end
total_per_number = 0
@net_profits = BettingSequence.map do |n|
total_per_number += n
36 * n - 7 * total_per_number
end
@snake_penalty = 7 * total_per_number
end
def simulate
@results = []
@counts = Hash.new { 0 }
@rng = @options[:seed] ? Random.new(@options[:seed]) : Random.new
@options[:iterations].times do
@options[:spins].times do
result = spin
record(result) if @options[:record]
if @results.length % 100_000 == 0
@ -92,7 +91,7 @@ class Roulette
print '.'
end
end
puts
puts if @results.length >= 10_000
end
def spin

View file

@ -7,44 +7,62 @@ require './roulette'
def main
options = Trollop::options do
opt :style, "American or European", :short => 's', :type => String, :default => 'American'
opt :iterations, "Number of iterations", :short => 'i', :type => :int, :default => 120
opt :style, "American or European", :type => String, :default => 'American'
opt :spins, "Number of spins", :short => 'n', :type => :int, :default => 60
opt :database, "Filename for results database", :type => String, :default => File.expand_path("~/Projects/Mystery7/results.sqlite")
opt :record, "Record results", :short => 'r'
opt :seed, "Seed for the RNG", :type => :int
opt :sessions, "Number of sessions to simulate", :short => 's', :type => :int, :default => 100
opt :misses, "Number of misses before sleeping", :short => 'm', :default => 4
opt :verbose, "Print stats after each spin", :short => 'v'
end
article = options[:style] == 'American' ? 'an' : 'a'
puts ">>> Simulating #{article} #{options[:style]} style game with #{options[:iterations]} iterations, sleeping after #{options[:misses]} miss#{options[:misses] > 0 ? 'es' : ''}..."
puts ">>> Simulating #{options[:sessions]} #{options[:style]} style games of #{options[:spins]} spins, sleeping after #{options[:misses]} miss#{options[:misses] > 0 ? 'es' : ''}..."
roulette = Roulette.new(options)
roulette = Roulette.new(options.dup)
puts ">>> Seed: #{roulette.seed}"
# puts ">>> Seed: #{roulette.seed}"
roulette.simulate
status = {
overall_status = {
:net => 0,
:sequence => 0,
:sleeping => true,
:snakes => 0,
:wins => 0
}
Roulette::Sets.each do |letter, set|
puts "# of #{letter.to_s.upcase}s: #{roulette.counts[letter]}" if options[:verbose]
set_status = roulette.set_status[letter]
puts "status: #{set_status.inspect}" if options[:verbose]
status[:net] += set_status[:net]
status[:snakes] += set_status[:snakes]
status[:wins] += set_status[:wins]
options[:sessions].times do
roulette.simulate
status = {
:net => 0,
:snakes => 0,
:wins => 0
}
Roulette::Sets.each do |letter, set|
puts "# of #{letter.to_s.upcase}s: #{roulette.counts[letter]}" if options[:verbose]
set_status = roulette.set_status[letter]
puts "status: #{set_status.inspect}" if options[:verbose]
status[:net] += set_status[:net]
status[:snakes] += set_status[:snakes]
status[:wins] += set_status[:wins]
end
overall_status[:net] += status[:net]
overall_status[:snakes] += status[:snakes]
overall_status[:wins] += status[:wins]
if options[:verbose]
puts "Net profit: #{status[:net]}"
puts "Wins: #{status[:wins]}"
puts "Snakes: #{status[:snakes]}"
end
end
puts "Net profit: #{status[:net]}"
puts "Wins: #{status[:wins]}"
puts "Snakes: #{status[:snakes]}"
puts "Net profit: #{overall_status[:net]}"
puts "Wins: #{overall_status[:wins]}"
puts "Snakes: #{overall_status[:snakes]}"
puts ">>> Results are in #{options[:database]}." if options[:record]
end