我正在尝试设计一种(好的)方法来从一系列可能的数字中选择一个随机数,其中该范围内的每个数字都被赋予一个权重。简单地说:给定数字范围 (0,1,2),选择一个数字,其中 0 有 80% 的概率被选中,1 有 10% 的几率被选中,2 有 10% 的几率被选中。
我的大学统计课已经过去了大约 8 年,所以你可以想象此刻我无法找到正确的公式。
这是我想出的“又便宜又脏”的方法。此解决方案使用 ColdFusion。您可以使用任何您喜欢的语言。我是程序员,我想我可以处理移植它。最终我的解决方案需要在 Groovy 中 - 我在 ColdFusion 中编写了这个,因为它很容易在 CF 中快速编写/测试。
public function weightedRandom( Struct options ) {
var tempArr = [];
for( var o in arguments.options )
{
var weight = arguments.options[ o ] * 10;
for ( var i = 1; i<= weight; i++ )
{
arrayAppend( tempArr, o );
}
}
return tempArr[ randRange( 1, arrayLen( tempArr ) ) ];
}
// test it
opts = { 0=.8, 1=.1, 2=.1 };
for( x = 1; x<=10; x++ )
{
writeDump( weightedRandom( opts ) );
}
我正在寻找更好的解决方案,请提出改进或替代方案。