Я понимаю, что прошло более 18 месяцев с тех пор, как этот вопрос был опубликован, но в случае, если кому-то еще это понадобится, я все равно отправлю свой ответ. Если единообразие выбора не важно, то подход , который Джастин описывает , является правильным. Однако, если важна единообразие, вы можете использовать адаптацию подхода Джастина (в действительно грубом псевдо-коде):
Generate a random value
Generate a random boolean
If the boolean is true {
Select the first item with a randomizer less than or equal to the random value
}
otherwise {
Select the first item with a randomizer greater than or equal to the random value
}
Generate a new random value
Set the selected items randomizer to the new random value
Я написал более подробную статью об этом на моем блоге с примерами, показывающими, почему распределение вероятностей нарушено.