roulette-wheel-selection 1.0.1 → 1.0.2
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +13 -3
- data/lib/roulette-wheel-selection.rb +35 -7
- data/lib/roulette-wheel-selection/version.rb +1 -1
- data/roulette-wheel-selection.gemspec +1 -1
- metadata +13 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b9666d28896171b78e19cf6b50a123b9177b5048695ac7d21b7ea7cfb8abf0b3
|
|
4
|
+
data.tar.gz: 194ece6957aadd240d567272d3d81edb98cd88c1a7c4f4f7686759ce8eafddd4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 74fd4bbcd66a24710c52b3fae66b8fcb7cf2af4b9da3b5ecd8615f0d4fbda6c5c2cc894bab9aadb00b5669d27318388ff6394961e6e0acd10682cf1831d1d31c
|
|
7
|
+
data.tar.gz: a88b3ba11e7ab066e5e35fa57b0da7d3c90ced0b4375e00ac7281f30d7c61c97aa141f937d17c2a72d0e7bda5a081531e4dff808994a74071778586483776387
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
## Change Log
|
|
2
|
+
|
|
3
|
+
### v1.0.1 2018/07/17
|
|
4
|
+
- [#3](https://github.com/khiav223577/roulette-wheel-selection/pull/3) Fix: zero weight objects should be ignored (@khiav223577)
|
|
5
|
+
- [#2](https://github.com/khiav223577/roulette-wheel-selection/pull/2) Fix: should return nil if input is empty (@khiav223577)
|
|
6
|
+
- [#1](https://github.com/khiav223577/roulette-wheel-selection/pull/1) try using new test reporter (@khiav223577)
|
data/README.md
CHANGED
|
@@ -31,17 +31,27 @@ require 'roulette-wheel-selection'
|
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
### Hash format
|
|
34
|
+
|
|
34
35
|
```rb
|
|
35
36
|
RouletteWheelSelection.sample(
|
|
36
|
-
'cola' => 40,
|
|
37
|
-
'sprite' => 20,
|
|
37
|
+
'cola' => 40,
|
|
38
|
+
'sprite' => 20,
|
|
38
39
|
'fanta' => 30,
|
|
39
40
|
'wine' => 40,
|
|
40
41
|
)
|
|
41
42
|
# => 'cola'
|
|
42
43
|
```
|
|
43
44
|
|
|
45
|
+
#### sample n random elements
|
|
46
|
+
|
|
47
|
+
```rb
|
|
48
|
+
roulette = RouletteWheelSelection.new('ps4' => 50, 'switch' => 40, 'xbox' => 30)
|
|
49
|
+
roulette.sample(3)
|
|
50
|
+
# => ['ps4', 'switch', 'xbox']
|
|
51
|
+
```
|
|
52
|
+
|
|
44
53
|
### Array format
|
|
54
|
+
|
|
45
55
|
```rb
|
|
46
56
|
drinks = [
|
|
47
57
|
{ name: 'cola', weight: 40 },
|
|
@@ -50,7 +60,7 @@ drinks = [
|
|
|
50
60
|
{ name: 'wine', weight: 40 },
|
|
51
61
|
]
|
|
52
62
|
RouletteWheelSelection.sample(drinks, :weight)
|
|
53
|
-
# => 'cola'
|
|
63
|
+
# => { name: 'cola', weight: 40 }
|
|
54
64
|
```
|
|
55
65
|
|
|
56
66
|
## Development
|
|
@@ -19,13 +19,41 @@ class RouletteWheelSelection
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def sample_from_hash(hash)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
RouletteWheelSelection.new(hash).sample
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def initialize(hash)
|
|
27
|
+
@hash = hash
|
|
28
|
+
@total_rate = hash.values.inject(&:+) || 0
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def sample(num = 1)
|
|
32
|
+
return if @total_rate == 0
|
|
33
|
+
return if num < 1
|
|
34
|
+
return sample_n_objects(num) if num > 1
|
|
35
|
+
return sample_an_object(@total_rate, @hash)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def sample_n_objects(num)
|
|
41
|
+
hash = @hash.clone
|
|
42
|
+
total_rate = @total_rate
|
|
43
|
+
num = total_rate if num > total_rate
|
|
44
|
+
return Array.new(num) do
|
|
45
|
+
obj = sample_an_object(total_rate, hash)
|
|
46
|
+
hash[obj] -= 1
|
|
47
|
+
total_rate -= 1
|
|
48
|
+
next obj
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def sample_an_object(total_rate, hash)
|
|
53
|
+
random_seed = rand(total_rate)
|
|
54
|
+
hash.each do |obj, rate|
|
|
55
|
+
return obj if random_seed < rate
|
|
56
|
+
random_seed -= rate
|
|
29
57
|
end
|
|
30
58
|
end
|
|
31
59
|
end
|
|
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
28
28
|
spec.require_paths = ["lib"]
|
|
29
29
|
|
|
30
|
-
spec.add_development_dependency
|
|
30
|
+
spec.add_development_dependency 'bundler', '>= 1.17', '< 3.x'
|
|
31
31
|
spec.add_development_dependency "rake", "~> 12.0"
|
|
32
32
|
spec.add_development_dependency "minitest", "~> 5.0"
|
|
33
33
|
end
|
metadata
CHANGED
|
@@ -1,29 +1,35 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: roulette-wheel-selection
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- khiav reoy
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2019-01-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.17'
|
|
20
|
+
- - "<"
|
|
18
21
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
22
|
+
version: 3.x
|
|
20
23
|
type: :development
|
|
21
24
|
prerelease: false
|
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
26
|
requirements:
|
|
24
|
-
- - "
|
|
27
|
+
- - ">="
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '1.17'
|
|
30
|
+
- - "<"
|
|
25
31
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
32
|
+
version: 3.x
|
|
27
33
|
- !ruby/object:Gem::Dependency
|
|
28
34
|
name: rake
|
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -60,6 +66,7 @@ extensions: []
|
|
|
60
66
|
extra_rdoc_files: []
|
|
61
67
|
files:
|
|
62
68
|
- ".gitignore"
|
|
69
|
+
- CHANGELOG.md
|
|
63
70
|
- Gemfile
|
|
64
71
|
- README.md
|
|
65
72
|
- Rakefile
|