배열에서 더 큰 숫자를 무작위로 가져 오는 알고리즘

Aug 19 2020

저는 조사를했고 일반적으로 작은 목록에 대한 알고리즘을 찾았습니다. 다음과 같은 배열이 있습니다.

arr = [1,2,3,4 .... , 96,97,98,99,100];

arr2 = [105, 110, 165, 170];

arr3 = [1,2,7,8,9];

이 배열을 함수에 보내고이 배열에서 난수를 얻고 싶지만 매번 더 큰 숫자를 얻을 확률이 더 높아지고 싶습니다.

예를 들어 배열 1에서 96의 확률은 4보다 커야하지만 97의 확률은 96보다 커야합니다.

요소의 무작위 가중치 분포를 생성하는 방법

일반적으로 솔루션은이 주제와 같습니다. 그러나 이로 인해 어레이에 성능 문제가 발생할 수 있습니다.

어떻게 할 수 있습니까?

답변

2 NinaScholz Aug 19 2020 at 15:29

확률을 계산하고 값을 선택할 수 있습니다.

사용자 지정 배열과 함께 사용하려면 random

getRandomValue = random(sortedArray),

그리고 나중에 루프에서

let value = getRandomValue();

const
    random = sortedValues => {
        let length = sortedValues.length,
            sum = length * (length + 1) / 2;

        return () => {
            let r = Math.random();
            return sortedValues.find((_, i) => (r -= (i + 1) / sum) <= 0);
        };
    },
    getRandomValue = random([6, 7, 8, 9, 10]),
    counts = {};

for (let i = 0; i < 1e6; i++) {
    let value = getRandomValue();
    counts[value] = (counts[value] || 0) + 1;
}

console.log(counts);
.as-console-wrapper { max-height: 100% !important; top: 0; }