mirror of
https://github.com/samsonjs/mystery7-simulator.git
synced 2026-04-27 15:07:42 +00:00
run multiple sessions to find out long term winnings
This commit is contained in:
parent
69144a3a30
commit
a7c33e4f06
2 changed files with 51 additions and 34 deletions
25
roulette.rb
25
roulette.rb
|
|
@ -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
|
||||
|
|
|
|||
60
simulate.rb
60
simulate.rb
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue