randprize 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZmZmNDNlYzJhYTdlYzgxNDdjMjQxYjBmYmJjMWI5Y2FkZjk1MGMwOA==
4
+ NGJiMTI3YjZlNjMyZTU4ZDg0NjFkNWZjYTdjMGE0MDdjYzkxZDg2OQ==
5
5
  data.tar.gz: !binary |-
6
- ZjBkMWEwOWFmZjlmMTk2MTBiNjM4NDU3NjQ3MTQyOGNmZDhlZmM5Zg==
6
+ ZTYwZDkzNWQwZjIxZTE1MDQ4MDQ2NWM2OTVkZjkxYmQzYzBhYTUzZA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- Yjg0MDRhNmU0ZDc3ODFiNzM4ZjU0ZTM4NDFiZGE4ZWU0YjRjNTFkYjhkMTRj
10
- Mzc4ZDY4Y2JiZWJjNDFlZGMxMTkxNjJkM2MyYTM5OWRlNjRmZWUzOTAyYjg3
11
- YzkwZWEwOWMxMmFiNDA1YTljMGIxZDc2MDIyMzRlZTNlYTc0YzE=
9
+ YzYwYzk0ZDZlN2UzNDk3ZDZlMGU0NmQzMWZiYzFiNWY4M2YzOTFjZWQ4NjY1
10
+ MThiODQwNGY5Mjg2MTE2N2Y2OWUyMmIwM2Y1NTVkMjA0ZGFhMGQ4MjA2MWFh
11
+ ZDQ1NjExZjIzYmNmMTMxNjc5Y2NhNWUwNDEyYWQ2YWZjZmRjYmQ=
12
12
  data.tar.gz: !binary |-
13
- MmM2YTExNzdmNDM2NTM5MTFjYzYyNzI3NzU5ZWRjM2M0NjlhOGIzNDAzNzQ2
14
- MzBmMGM0ZWZiOGUxZDdiZTczN2JiNzE5YWM2ZWMyYTMzNGMzOTcwOWM3YWM3
15
- MmYwNzcwNDliMjA2ODVmNTJiOTczZTIyZjM0NjlhMjgxZDgwOWU=
13
+ ZGUxZGU0NjBmZjc2NzNjYjA1ZTY1ODExZGJjZjY3M2EwODU5ZmEyYWUyZDRm
14
+ MmRjM2UzNWU3YjJiOWEwMTAzYTk3YTBhZGQxMmVmNTMyZWRhM2RmZjBhN2Rk
15
+ OTkyMzNlZWYxYjM2NjVjNjU4YmQ2ZmVmMjE3MTEzMDM4MThiMTA=
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
+ [![Build Status](https://travis-ci.org/semdinsp/randprize.png)](https://travis-ci.org/semdinsp/randprize)
2
+ [![Code Climate](https://codeclimate.com/repos/524654d9c7f3a31b29038e3a/badges/58ed8386e3e6d266c7ac/gpa.png)](https://codeclimate.com/repos/524654d9c7f3a31b29038e3a/feed)
1
3
  randprize gem
2
4
  ============
3
5
 
4
- Given a hash of prizes and odds randomly return a prize.
6
+ Given a hash of prizes and odds randomly return a prize.
@@ -6,6 +6,10 @@ module Randprize
6
6
  def debug
7
7
  true
8
8
  end
9
+ def initialize
10
+ # puts "Running a few random numbers to settle random generator"
11
+ 1.upto(10000) {|i| self.rand }
12
+ end
9
13
  def random_generator
10
14
  self.randgen=Random.new if self.randgen==nil
11
15
  self.randgen
@@ -20,7 +24,8 @@ module Randprize
20
24
  def set_range(range)
21
25
  self.myrange=range
22
26
  end
23
- def rand_range
27
+
28
+ def random_range
24
29
  self.random_generator.rand(self.myrange)
25
30
  end
26
31
 
@@ -0,0 +1,67 @@
1
+ require 'rubygems'
2
+
3
+ module Randprize
4
+ class ManagePrizes < Randprize::Base
5
+ attr_accessor :myprizelist, :keylist, :myranges, :worstoddprize
6
+ # Take the prizes in array and massage the hashlist into something we can use
7
+ # Add ranges
8
+ # eg { key1=>{odds,name,value,key} key3=>{odds,name,value,key}
9
+ def prize_list(prizehash)
10
+ self.myprizelist=Marshal.load(Marshal.dump(prizehash)) #deep copy
11
+ self.keylist=self.myprizelist.keys
12
+ raise 'prizelist must have at least two entries' if self.keylist.size<2
13
+ self.myranges={}
14
+ self.worstoddprize=0
15
+ normalize_odds
16
+
17
+ end
18
+ # normalize the odds to the largest odd value..
19
+ # odds must be in format 1 in x
20
+ def normalize_odds
21
+ self.keylist.each { |key|
22
+ # puts "key is #{key} odds are: #{self.myprizelist[key]['odds']}"
23
+ self.worstoddprize=[self.myprizelist[key]['odds'],self.worstoddprize].max if self.myprizelist[key]['odds']!="REMAINING"
24
+ }
25
+ start=0
26
+ finish=0
27
+ self.keylist.each { |key|
28
+ if self.myprizelist[key]['odds']=="REMAINING"
29
+ finish=self.worstoddprize
30
+ else
31
+ self.myprizelist[key]['odds']=self.worstoddprize/self.myprizelist[key]['odds']
32
+ finish=self.myprizelist[key]['odds']+start
33
+ end
34
+ finish=finish.round.to_i
35
+ self.myranges[key]=(start...finish) #excludes finish
36
+ start=finish
37
+ }
38
+ range=(0...finish)
39
+ self.set_prize_range(range)
40
+ #odds now converted to outof of worst case
41
+ #puts "#{self.myprizelist.inspect}"
42
+ raise 'prize list does not have full coverage (less prizes than odds) ' if finish<self.worstoddprize
43
+ raise 'prize list has more prizes than coverage (more prizes than odds) ' if finish>self.worstoddprize
44
+ end
45
+ def view_details
46
+ puts "Prizes: [#{self.myprizelist.inspect}]"
47
+ puts "Ranges [#{self.myranges.inspect}]"
48
+ puts "All Prize Range: [#{self.myrange.inspect}]"
49
+ end
50
+ def set_prize_range(rng)
51
+ self.myrange=rng
52
+ end
53
+ def random_prize
54
+ self.check_prize(self.random_range)
55
+ end
56
+ def check_prize(randnum)
57
+ #puts "ranges #{self.myranges.inspect}"
58
+ foundkey=""
59
+ self.keylist.each {|key| foundkey= key if self.myranges[key].include?(randnum)}
60
+ raise "rand num wrong range #{randnum} #{self.myrange}" if !self.myrange.include?(randnum)
61
+ raise "key not found check random number #{randnum} #{foundkey}" if !self.keylist.include?(foundkey)
62
+ self.myprizelist[foundkey]
63
+ end
64
+
65
+
66
+ end # Class
67
+ end #Module
@@ -4,6 +4,13 @@ class RandprizeTest < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @f=Randprize::Base.new
7
+ @pm=Randprize::ManagePrizes.new
8
+ @headstails={ "T"=> {'odds'=> 2,'name'=>'win tails','value'=>0},"H"=> {'odds'=> 2,'name'=>'win heads','value'=>1}}
9
+ @dice={}
10
+ 1.upto(6) {|i| @dice[i.to_s]= {'odds'=> 6,'name'=>"rolled #{i}",'value'=>i} }
11
+ @large={ "GP"=> {'odds'=> 100,'name'=>'grandprize','value'=>50000},"H"=> {'odds'=> 'REMAINING','name'=>'win heads','value'=>1}}
12
+ @exlarge={ "GP"=> {'odds'=> 50000,'name'=>'grandprize','value'=>50000},"2nd"=> {'odds'=> 5000,'name'=>'2ndprize','value'=>50000},"H"=> {'odds'=> 'REMAINING','name'=>'win heads','value'=>1}}
13
+
7
14
  end
8
15
 
9
16
  def test_basic
@@ -13,14 +20,128 @@ class RandprizeTest < Test::Unit::TestCase
13
20
  @f.set_random_generator(Random.new)
14
21
  assert @f.random_generator!=Random.new, "diff generatros"
15
22
  end
23
+ def test_view
24
+ assert_nothing_raised do
25
+ @pm.prize_list(@exlarge)
26
+ @pm.view_details
27
+ end
28
+
29
+ end
16
30
  def test_range
17
31
  range=(0..10)
18
32
  @f.set_range(range)
19
33
  1.upto(100) do
20
- res=@f.rand_range
34
+ res=@f.random_range
35
+ assert range.include?(res), "range return wrong #{res}"
36
+ end
37
+ end
38
+ def test_range2
39
+ range=(10..20)
40
+ @f.set_range(range)
41
+ 1.upto(100) do
42
+ res=@f.random_range
21
43
  assert range.include?(res), "range return wrong #{res}"
22
44
  end
23
45
  end
46
+ def test_extralarge
47
+ @pm.prize_list(@exlarge)
48
+ assert @pm.keylist.include?("GP"), "only one key"
49
+ assert @pm.check_prize(0)['name']=='grandprize', "shuld return 1"
50
+ assert @pm.check_prize(5)['name']=='2ndprize', "shuld return 6"
51
+ end
52
+ def test_large
53
+ @pm.prize_list(@large)
54
+ assert @pm.keylist.include?("GP"), "only one key"
55
+ assert @pm.check_prize(0)['name']=='grandprize', "shuld return 1"
56
+ assert @pm.check_prize(5)['name']=='win heads', "shuld return 6"
57
+ end
58
+ def test_dice
59
+ 1.upto(10) do
60
+ @pm.prize_list(@dice)
61
+ assert @pm.keylist.include?("1"), "only one key"
62
+ assert @pm.check_prize(0)['name']=='rolled 1', "shuld return 1"
63
+ assert @pm.check_prize(5)['name']=='rolled 6', "shuld return 6"
64
+ end
65
+ end
66
+ def test_scott
67
+ puts "SCOTTT Here"
68
+ @pm.prize_list(@headstails)
69
+ aprize=@pm.random_prize
70
+ puts "aprize is #{aprize}, count "
71
+ puts " myrange #{@pm.myrange} rand range returns: #{@pm.random_range}"
72
+ puts "should be heads #{@pm.check_prize(1)} tails #{@pm.check_prize(0)}"
73
+ @pm.view_details
74
+ 1.upto(200) do
75
+ rn= @pm.random_range
76
+ assert rn<2, "rand shuld be less than 2 for #{@pm.myrange} "
77
+ end
78
+ end
79
+ def test_randomprize_forrandom
80
+ steps=2000
81
+ count=0
82
+ 1.upto(steps) do
83
+ @pm.prize_list(@headstails)
84
+ prizes=[]
85
+ @pm.myprizelist.each {|k| #puts "K is #{k}"
86
+ prizes << k[1]}
87
+ aprize=@pm.random_prize
88
+ assert prizes.include?(aprize), "prize should be from the list"
89
+ #puts "count #{count} aprize #{aprize}"
90
+ count=aprize['value']+count
91
+ end
92
+ ratio=(count.to_f/steps)*100
93
+ assert (49..51).include?(ratio.round), "ratio wrong #{ratio.round} count #{count}"
94
+ end
95
+ def test_randomprize
96
+ 1.upto(20) do
97
+ @pm.prize_list(@headstails)
98
+ prizes2=[]
99
+ @pm.myprizelist.each {|k| #puts "K is #{k}"
100
+ prizes2 << k[1]}
101
+ # puts "prizes2 are: #{prizes2.inspect}"
102
+ aprize2=@pm.random_prize
103
+ assert prizes2.include?(aprize2), "prize should be from the list #{prizes2} #{aprize2}"
104
+ end
105
+ end
106
+ def test_prizemanager_binomials
107
+ 1.upto(25) do
108
+ @pm.prize_list(@headstails)
109
+ assert @pm.keylist.include?("H"), "only one key"
110
+ assert @pm.check_prize(0)['name']=='win tails', "shuld return tails"
111
+ assert @pm.check_prize(1)['name']=='win heads', "shuld return heads"
112
+ end
113
+ end
114
+ def test_acheckprize
115
+ @pm.prize_list(@headstails)
116
+ assert @pm.check_prize(1)['name']=='win heads', "shuld return heads"
117
+ assert_raise(RuntimeError) do
118
+ @pm.check_prize(7)
119
+ end
120
+ assert_raise(RuntimeError) do
121
+ @pm.check_prize(2)
122
+ end
123
+ assert_nothing_raised do
124
+ @pm.check_prize(1)
125
+ end
126
+ end
127
+ def test_prizemanager_not_enough_prizes
128
+ @prize1={ "0"=> {'odds'=> 2,'name'=>'win nothing','value'=>0}}
129
+
130
+ assert_raise(RuntimeError) do
131
+ @pm.prize_list(@prize1)
132
+ assert @pm.keylist.include?("0"), "only one key"
133
+ end
134
+
135
+ end
136
+ def test_prizemanager_bad_range
137
+ @prize2badrange={ "0"=> {'odds'=> 2,'name'=>'win nothing','value'=>0},"1"=> {'odds'=> 10,'name'=>'win something','value'=>10}}
138
+ assert_raise(RuntimeError) do
139
+ @pm.prize_list(@prize2badrange)
140
+ assert @pm.keylist.include?("0"), "only one key"
141
+ end
142
+
143
+
144
+ end
24
145
 
25
146
 
26
147
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: randprize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Sproule
@@ -17,6 +17,7 @@ extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
19
  - lib/randprize/base.rb
20
+ - lib/randprize/manage_prizes.rb
20
21
  - lib/randprize.rb
21
22
  - test/randprize.rb
22
23
  - test/test_helper.rb