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 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