Я пытаюсь разработать (хороший) способ выбора случайного числа из диапазона возможных чисел, где каждое число в диапазону дается вес. Проще говоря: учитывая диапазон чисел (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 ) );
}
Я ищу лучшие решения, пожалуйста, предложите улучшения или альтернативы.