Author: ntk
License:
The MIT License, Copyright (c) 2007 ntk
Inspired by:
Lottery Quick Pick Hints:
Lottery mathematics
class Lottery
def playing(i=1, n1=0, r1=0..0, n2=0, r2=0..0)
return nil unless i.is_a?(Integer) && n1.is_a?(Integer) && n1 > 0 && r1.is_a?(Range) && n2.is_a?(Integer) && r2.is_a?(Range)
stats = Hash.new(0)
ret = []
random_procs = [
lambda { |a,n| a.slice!(rand(n)) },
lambda { |a,n| a.slice!(rand(n) * -1) },
lambda { |a,n| a.slice!((rand(n) * -1) + rand(n)) },
lambda { |a,n| a.slice!((rand(n) - rand(n))) },
lambda { |a,n| a.reverse!.slice!(rand(n)) },
lambda { |a,n| a.reverse!.slice!(rand(n) * -1) },
lambda { |a,n| a.reverse!.slice!((rand(n) * -1) + rand(n)) },
lambda { |a,n| a.reverse!.slice!((rand(n) - rand(n))) }
]
i.times do
numbers = r1.to_a.sort_by {rand}
num = numbers.size
ar = []
count = 0
while count < n1 + n2
count += 1
if count > n1 && n2 > 0
numbers2 = r2.to_a
numbers2 = (numbers & numbers2).sort_by {rand}
num2 = numbers2.size
count2 = 0
while count2 < n2
count2 += 1
i = rand(random_procs.size)
random_procs = random_procs.sort_by {rand}
random_num = random_procs.at(i).call(numbers2, num2)
stats[random_num] += 1
ar << random_num
numbers2 = numbers2.sort_by {rand}
num2 -= 1
end
if count2 > 1 then count += (count2-1) end
else
i = rand(random_procs.size)
random_procs = random_procs.sort_by {rand}
random_num = random_procs.at(i).call(numbers, num)
stats[random_num] += 1
ar << random_num
numbers = numbers.sort_by {rand}
num -= 1
end
end
ret << ar
end
ret << stats
end
end
puts
puts "UK National Lottery, German Lotto 6/49, ..."
ndraws = 10
result = Lottery.new.playing(ndraws, 6, 1..49)
stats = result.pop
result.each do |t|
puts t.sort.join('-')
end
puts
n = 0
stats.sort.each do |k,v|
i = (v / (ndraws * 6.0) ) * 100.0
n += i
puts "#{k} :: #{v} :: #{i}%"
end
p n
puts
puts "US Powerball Lottery"
Lottery.new.playing(ndraws, 5, 1..55, 1, 1..42)[0..-2].each do |t|
n = t.pop
puts "#{t.sort.join('-')} and #{n}"
end
puts
puts "Mega Millions"
Lottery.new.playing(ndraws, 5, 1..56, 1, 1..46)[0..-2].each do |t|
n = t.pop
puts "#{t.sort.join('-')} and #{n}"
end
puts
puts "EuroMillions"
Lottery.new.playing(ndraws, 5, 1..50, 2, 1..9)[0..-2].each do |t|
n1 = t.pop
n2 = t.pop
puts "#{t.sort.join('-')} and #{n1}-#{n2}"
end
puts
puts "US Powerball Lottery"
ndraws = 10
nums = [5, 23, 25, 33, 34]
pb = 31
matches = []
n = 0
Lottery.new.playing(ndraws, 5, 1..55, 1, 1..42)[0..-2].each do |t|
i = t.pop
t = t.sort
if (t & nums).size > matches.size || ( matches.size == 0 && i == pb )
matches = t & nums
i == pb ? n = i : n = 0
end
end
if pb == n && !matches.empty?
puts "Your numbers: #{nums.join('-')} and #{pb}\nYour matches: #{matches.join('-')} and #{n}"
elsif pb == n && matches.empty?
puts "Your numbers: #{nums.join('-')} and #{pb}\nYour matches: [] and #{n}"
else
puts "Your numbers: #{nums.join('-')} and #{pb}\nYour matches: #{matches.join('-')}"
end