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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e3484337fe62871d485f23ef11feba7ee6d474358bc77ed9024d079c9aaa54c
4
- data.tar.gz: 88b36caaf509f594f708529da4eaa924e7d0a2ee9fe940ae6595e18f25001a42
3
+ metadata.gz: b9666d28896171b78e19cf6b50a123b9177b5048695ac7d21b7ea7cfb8abf0b3
4
+ data.tar.gz: 194ece6957aadd240d567272d3d81edb98cd88c1a7c4f4f7686759ce8eafddd4
5
5
  SHA512:
6
- metadata.gz: 3fbe3ca6f8517b5fc1609d2872aa79204b8459adcfcd31c272d9d72b2295b9169824d52802db7f01eba06c174d64230b6b722a9ea46c2296c3513f4e4697ac40
7
- data.tar.gz: 2df389f4ebe67517f858af187021f2eab13e1934e8e86a62956ec8c3eaf26f3a89d134815b409f00888cca4f1d0152eeb6ac7f1b1e38b236cf9aab8696299445
6
+ metadata.gz: 74fd4bbcd66a24710c52b3fae66b8fcb7cf2af4b9da3b5ecd8615f0d4fbda6c5c2cc894bab9aadb00b5669d27318388ff6394961e6e0acd10682cf1831d1d31c
7
+ data.tar.gz: a88b3ba11e7ab066e5e35fa57b0da7d3c90ced0b4375e00ac7281f30d7c61c97aa141f937d17c2a72d0e7bda5a081531e4dff808994a74071778586483776387
@@ -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
- total_rate = hash.values.inject(&:+) || 0
23
- return if total_rate == 0
24
- random_seed = rand(total_rate)
25
- hash.each do |obj, rate|
26
- return obj if random_seed < rate
27
- random_seed -= rate
28
- end
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
@@ -1,3 +1,3 @@
1
1
  class RouletteWheelSelection
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  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 "bundler", "~> 1.11"
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.1
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: 2018-07-17 00:00:00.000000000 Z
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: '1.11'
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: '1.11'
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