Class: EnvelopeAlloc::Provider
- Inherits:
-
Object
- Object
- EnvelopeAlloc::Provider
- Defined in:
- lib/envelope_alloc.rb
Instance Attribute Summary collapse
-
#alloc_num ⇒ Object
readonly
Returns the value of attribute alloc_num.
-
#item_max ⇒ Object
readonly
Returns the value of attribute item_max.
-
#total_num ⇒ Object
readonly
Returns the value of attribute total_num.
-
#unit ⇒ Object
readonly
Returns the value of attribute unit.
Instance Method Summary collapse
- #alloc_items ⇒ Object
-
#initialize(total_num, alloc_num, options = {}) ⇒ Provider
constructor
A new instance of Provider.
- #split_left_items(money_left, value_vec) ⇒ Object
Constructor Details
#initialize(total_num, alloc_num, options = {}) ⇒ Provider
Returns a new instance of Provider.
8 9 10 11 12 13 |
# File 'lib/envelope_alloc.rb', line 8 def initialize total_num, alloc_num, ={} @total_num = total_num @alloc_num = alloc_num @unit = [:unit] || 100 @item_max = [:item_max] || (200 * @unit) end |
Instance Attribute Details
#alloc_num ⇒ Object (readonly)
Returns the value of attribute alloc_num.
6 7 8 |
# File 'lib/envelope_alloc.rb', line 6 def alloc_num @alloc_num end |
#item_max ⇒ Object (readonly)
Returns the value of attribute item_max.
6 7 8 |
# File 'lib/envelope_alloc.rb', line 6 def item_max @item_max end |
#total_num ⇒ Object (readonly)
Returns the value of attribute total_num.
6 7 8 |
# File 'lib/envelope_alloc.rb', line 6 def total_num @total_num end |
#unit ⇒ Object (readonly)
Returns the value of attribute unit.
6 7 8 |
# File 'lib/envelope_alloc.rb', line 6 def unit @unit end |
Instance Method Details
#alloc_items ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/envelope_alloc.rb', line 15 def alloc_items return [total_num] if alloc_num == 1 money_left = (total_num - alloc_num * unit) value_vec = [] 0.upto(alloc_num-2) do |i| mu = money_left / (alloc_num - i) sigma = mu / 2 rg = RandomGaussian.new(mu, sigma) noise_value = rg.rand.to_i noise_value = 0 if noise_value < 0 noise_value = money_left if noise_value > money_left threshold_value = item_max - unit noise_value = threshold_value if noise_value > threshold_value value_vec << (noise_value + unit) money_left -= noise_value end money_left = (total_num - value_vec.reduce(&:+)) last_money = money_left > item_max ? item_max : money_left value_vec << last_money money_left = money_left - last_money split_left_items(money_left, value_vec) value_vec end |
#split_left_items(money_left, value_vec) ⇒ Object
42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/envelope_alloc.rb', line 42 def split_left_items(money_left, value_vec) return unless money_left > 0 value_vec.map! do |val| gap = item_max - val if money_left > gap money_left -= gap item_max else value = val + money_left money_left = 0 value end end end |