diff --git a/README.md b/README.md index e746173..1dec671 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,34 @@ const pseudoCumulativeWeights = [ Элемент `1`: ≈ 9% +В общем случае функция выглядит примерно так: +```javascript + +function weightedRandom(items, weights) { + if (items.length !== weights.length) { + throw new Error('Массивы элементов и весов должны быть одинакового размера'); + } + + if (!items.length) { + throw new Error('Элементы массива не должны быть пустыми'); + } + const cumulativeWeights = []; + for (let i = 0; i < weights.length; i += 1) { + cumulativeWeights[i] = weights[i] + (cumulativeWeights[i - 1] || 0); + } + + const maxCumulativeWeight = cumulativeWeights[cumulativeWeights.length - 1]; + + const randomNumber = maxCumulativeWeight * Math.random(); + + for (let itemIndex = 0; itemIndex < items.length; itemIndex += 1) { + if (cumulativeWeights[itemIndex] >= randomNumber) { + return items[itemIndex]; + } + } +} +``` + ## Как можно еще лучше алгоритм генерации слов? Данный скрипт является больше примером использования алгоритма выбора случайного элемента массива на основе их веса, поэтому я не