weighted_random_selector 1.0.0

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/weighted_random_selector.rb +23 -0
  3. metadata +46 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c17875b45bf0470dd32ffefb016f19bbb34ac0580af07e7800a7e9186e768c5a
4
+ data.tar.gz: 9b8c21f04870070602804eae5603635162a7b2074064db3cfff5bd32269ef3b9
5
+ SHA512:
6
+ metadata.gz: 6b1432a4217bf87189bbf82ae7b27cdeb4a2b345dd9fd0a0b94bdea875171c44b081c4d71329b0f19c0dd153bf170b33f50a1202d9909ca1a262736ade69f274
7
+ data.tar.gz: 387c1ad9b156e4e9ffe5e09410d9c398f2803fb9f8653310cb8119c6d5c1500aaa1c037169a41933e87af29a43b80cc883790d8f85a8e07674858500a98bf543
@@ -0,0 +1,23 @@
1
+ class WeightedRandomSelector
2
+
3
+ def self.select_from_hash_list(hash_list)
4
+
5
+ # Calculate the sum of the weights
6
+ weighted_sum = hash_list.map{|k,v| v}.reduce(:+)
7
+ random_num = 1 + rand(weighted_sum)
8
+
9
+ # Imagine random_num is a number between 1 and the sum of the weights.
10
+ # This range is partitioned to identify each hash key.
11
+
12
+ # Ex: If the key A has a weight of 4 and B has a weight of 10
13
+ # Weighted sum will be 14. If the random number is 1-4 then A will be selected
14
+ # If the random number is 5-14 then B will be selected
15
+
16
+ counter = 0
17
+ hash_list.each do |k,v|
18
+ counter += v
19
+ return k if counter >= random_num
20
+ end
21
+ raise "Something went wrong with this gem."
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: weighted_random_selector
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Nicholas Ellul
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-27 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: When the method `select_from_hash_list` is given an array of hashes where
14
+ the value of each hash is a weight, the gem will take that into account and select
15
+ a value at random.
16
+ email: nicholas.ellul1@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/weighted_random_selector.rb
22
+ homepage: http://rubygems.org/gems/weighted_random_selector
23
+ licenses:
24
+ - MIT
25
+ metadata: {}
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project:
42
+ rubygems_version: 2.7.6
43
+ signing_key:
44
+ specification_version: 4
45
+ summary: Randomly select value based on weights
46
+ test_files: []