Генерация взвешенных случайных чисел в Javascript

У меня есть массив, который выглядит примерно так:

[
    {
        plays: 0,
        otherData: someValues
    }, {
        plays: 4,
        otherData: someValues
    }, {
        plays: 1,
        otherData: someValues
    }, {
        plays: 2,
        otherData: someValues
    } {
        plays: 9,
        otherData: someValues
    }, {
        plays: 7,
        otherData: someValues
    }, {
        plays: 5,
        otherData: someValues
    }, {
        plays: 0,
        otherData: someValues
    }, {
        plays: 8,
        otherData: someValues
    }
]

Это's массив информации о песнях в плейлисте, гдеplays это количество раз, когда песня была воспроизведена. Я' пытаясь придумать генератор взвешенных случайных чисел, который выберет индекс элемента, взвешенного таким образом, что менее проигранные песни будут с большей вероятностью выбраны. Вот's код у меня сейчас:

function pickRandom(){
    var oldIndex = index;
    if(songs.length  0)
        return index = unheard[Math.round(Math.random() * (unheard.length - 1))];
    var tries = 0;
    while(index == oldIndex && tries < 100){
        index = Math.round(Math.random() * (songs.length - 1));
        tries++;
    }return index;
}

Есть несколько вещей с этим решением, которые яЯ недоволен. Во-первых, этоне так сильно взвешены, как на самом деле просто выбирает не сыгранную песню или любую старую случайную, если все в массиве было воспроизведено хотя бы один раз. Во-вторых, он создает новый массив, и, поскольку плейлисты иногда содержат сотни песен,что-то яЯ хотел бы держаться подальше от, если это возможно.

Ближайшее решение яудалось придумать, копирует каждый элемент в новый массив несколько раз на основе егоplays значение, затем выберите элемент из этого, но это ухудшает проблему создания нового массива, так как этот второй массив может легко достигать тысяч элементов. Я'буду очень признателен за любую помощь или предложения; даже псевдокод будет в порядке.

Ответы на вопрос(2)

Ваш ответ на вопрос