/* <CoffeeScript>
class RandomPicker # !TODO: Need to document config and methods!!!
</CoffeeScript> */
/**
* @class Lumenize.RandomPicker
*
* Takes a config object like the one shown below, with the same format as is output by Lumenize.histogram()
*
* config =
* histogram: [
* { label: '< 10', count: 1 }, # histogram fields index, startOn, and endBelow are ignored, but returned by getRow() if provided
* { label: '10-20', count: 10 },
* { label: '20-30', count: 102 },
* { label: '30-40', count: 45},
* { label: '>= 40', count: 7}
* ]
*
* So that it will make more sense when used with hand generated distributions, it will also take the following
*
* config =
* distribution: [
* { value: -1.0, p: 0.25 }
* { value: 2.0, p: 0.50 },
* { value: 8.0, p: 0.25 }
* ]
*
* Note, that it runs the same exact code, just replacing what fields are used for the frequencyField and returnValueField
* Similarly, you can override these by explicitly including them in your config.
*
* Also, note that you need not worry about making your 'p' values add up to 1.0. It figures out the portion of the total
*
*/
/* <CoffeeScript>
constructor: (@config) ->
if @config.histogram?
@table = @config.histogram
else if @config.distribution?
@table = @config.distribution
else
throw new Error('Must provide either a histogram or distribution in your config.')
unless @config.frequencyField?
if @config.histogram?
@config.frequencyField = 'count'
else if @config.distribution?
@config.frequencyField = 'p'
unless @config.returnValueField?
if @config.histogram?
@config.returnValueField = 'label'
else if @config.distribution?
@config.returnValueField = 'value'
total = 0
total += r[@config.frequencyField] for r in @table
r._p = r[@config.frequencyField] / total for r in @table
cumulative = 0
for r in @table
cumulative += r._p
r._pCumulative = cumulative
getRow: () ->
n = Math.random()
for r in @table
if n < r._pCumulative
return r
return @table[@table.length - 1] # Needed in rare cases due to real number math approximations
get: () ->
return @getRow()[@config.returnValueField]
exports.RandomPicker = RandomPicker
</CoffeeScript> */