roulette-wheel-selection 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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