randprize 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/README.md +3 -1
- data/lib/randprize/base.rb +6 -1
- data/lib/randprize/manage_prizes.rb +67 -0
- data/test/randprize.rb +122 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NGJiMTI3YjZlNjMyZTU4ZDg0NjFkNWZjYTdjMGE0MDdjYzkxZDg2OQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZTYwZDkzNWQwZjIxZTE1MDQ4MDQ2NWM2OTVkZjkxYmQzYzBhYTUzZA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YzYwYzk0ZDZlN2UzNDk3ZDZlMGU0NmQzMWZiYzFiNWY4M2YzOTFjZWQ4NjY1
|
10
|
+
MThiODQwNGY5Mjg2MTE2N2Y2OWUyMmIwM2Y1NTVkMjA0ZGFhMGQ4MjA2MWFh
|
11
|
+
ZDQ1NjExZjIzYmNmMTMxNjc5Y2NhNWUwNDEyYWQ2YWZjZmRjYmQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZGUxZGU0NjBmZjc2NzNjYjA1ZTY1ODExZGJjZjY3M2EwODU5ZmEyYWUyZDRm
|
14
|
+
MmRjM2UzNWU3YjJiOWEwMTAzYTk3YTBhZGQxMmVmNTMyZWRhM2RmZjBhN2Rk
|
15
|
+
OTkyMzNlZWYxYjM2NjVjNjU4YmQ2ZmVmMjE3MTEzMDM4MThiMTA=
|
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
+
[](https://travis-ci.org/semdinsp/randprize)
|
2
|
+
[](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.
|
data/lib/randprize/base.rb
CHANGED
@@ -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
|
-
|
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
|
data/test/randprize.rb
CHANGED
@@ -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.
|
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.
|
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
|