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