randomWeightedSelection(weights, n)
Last updated May 25, 2006
Version: 1 | Requires: CF5 | Library: DataManipulationLib
Description:
Requires a structure and the number of selections to make (with replacement).
All keys are selectable elements.
All values are unbounded numeric weights, representing the likelyhood of selection for their respective keys.
Based on free code by Peter Norvig (http://aima.cs.berkeley.edu/python/search.html).
Return Values:
Returns an array.
Example:
<cfset data = structNew()>
<cfset data['abc'] = 5>
<cfset data['def'] = 20>
<cfset data['mno'] = 50>
<cfset data['xyz'] = 25>
<cfset counts = structNew()>
<cfset toLimit = 100>
<cfloop index="index" from="1" to="#toLimit#">
<cfset sels = randomWeightedSelection(data,1)>
<cfif not StructKeyExists(counts,sels[1])><cfset counts[sels[1]] = 0></cfif>
<cfset counts[sels[1]] = counts[sels[1]]+1>
</cfloop>
<cfloop index="key" list="#StructKeyList(counts)#">
<cfoutput>
<p>#key#(#data[key]#) = #counts[key]/toLimit#</p>
</cfoutput>
</cfloop>
Parameters:
Name | Description | Required |
---|---|---|
weights | Structure with keys and numeric values for weights. | Yes |
n | Number of selections to make. | Yes |
Full UDF Source:
/**
* Returns a number of random selections from a list based on their given weights.
*
* @param weights Structure with keys and numeric values for weights. (Required)
* @param n Number of selections to make. (Required)
* @return Returns an array.
* @author Chris Spencer (chrisspen@gmail.com)
* @version 1, May 25, 2006
*/
function randomWeightedSelection(weights, n){
var seq = structKeyArray(weights);
var totals = arrayNew(1);
var runningtotal = 0;
var selections = arrayNew(1);
var s = 0;
var i = 0;
for(i=1; i lte arrayLen(seq); i=i+1){
runningtotal = runningtotal + weights[seq[i]];
arrayAppend(totals, runningtotal);
}
for(s=1; s lte n; s=s+1){
r = rand()*runningtotal;
for(i=1; i lte arrayLen(seq); i=i+1){
if(totals[i] gt r){
arrayAppend(selections,seq[i]);
break;
}
}
}
return selections;
}
Search CFLib.org
Latest Additions
Raymond Camden added
QueryDeleteRows
November 04, 2017
Leigh added
nullPad
May 11, 2016
Raymond Camden added
stripHTML
May 10, 2016
Kevin Cotton added
date2ExcelDate
May 05, 2016
Raymond Camden added
CapFirst
April 25, 2016