-
function choosePercent(p) { let total = 0; for(let i = 0; i < p.length; i++) { total += p[i]; } let r = Math.random() * total; for(let i = 0; i < p.length; i++) { if(p[i] == 0) continue; if(r <= p[i]) return i; else r -= p[i]; } return -1; }
여러개의 다른 확률에 의한 결과가 필요할때
let p = choosePercent([50, 25, 15, 5]);
위와 같이 50%, 25%, 15%, 5%를 배열에 담고 실행하면
index 확률 0 50% 1 25% 2 15% 3 5% 0이 나올 확률 50%
1이 나올 확률 25%
2가 나올 확률 15%
3이 나올 확률 5%
이처럼 확률에 해당하는 index가 나오게 됩니다.
let p = choosePercent([40, 10, 10, 0, 30, 30]);
배열의 총 합이 100을 넘거나 넘지 않아도 상관 없고
확률이 중복이어도 되고 순서도 상관 없으며
0%는 선택되지 않습니다.
let p = choosePercent([0]);
확률이 0%일때는 선택하지 않고
배열의 범위 밖인 -1을 반환합니다.
댓글