Генерация взвешенного случайного числа

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

Я ищу лучшие решения, пожалуйста, предложите улучшения или альтернативы.

45
задан Daniel A. White 10 June 2015 в 23:08
поделиться