Class: Starter::Random::DiscreteSequence

Inherits:
Sequence
  • Object
show all
Defined in:
lib/starter/random.rb

Instance Attribute Summary collapse

Attributes inherited from Sequence

#generator

Instance Method Summary collapse

Methods inherited from Sequence

random_pool_seed, random_seed, serial_count

Constructor Details

#initialize(opt = {}) ⇒ DiscreteSequence

Returns a new instance of DiscreteSequence.



205
206
207
208
209
210
211
212
213
214
215
# File 'lib/starter/random.rb', line 205

def initialize opt = {}
  super
  @distrib = opt[:distrib] || { 0 => 1.0 }
  
  sum = @distrib.inject(0) {|sum, (pt, prob)| sum + prob}
  sum = sum.to_f # so division is ok
  
  @distrib.keys.each do |point|
    @distrib[point] /= sum
  end
end

Instance Attribute Details

#distribObject (readonly)

Returns the value of attribute distrib.



203
204
205
# File 'lib/starter/random.rb', line 203

def distrib
  @distrib
end

Instance Method Details

#nextObject



217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/starter/random.rb', line 217

def next
  loop do
    r = super
    @distrib.each do |point, probability|
      if r < probability
        return point
      end
      r -= probability
    end
    # repeat if failed to get a result (due to floating point imprecision)
  end
  ## this would be faster using an rbtree
end