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 +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
|
+
[![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.
|
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
|