프로그램/Java
범위 지정 랜덤 & 가중치 랜덤
milktea.kang
2020. 10. 28. 16:20
지정 된 범위에서 랜덤하게 숫자 하나를 뽑아내려 할 때
예를 들어 1에서 45사이의 숫자 중에 랜덤하게 하나를 뽑아내려 한다면
public int randomRange(int n1, int n2) {
return (int) (Math.random() * (n2 - n1 + 1)) + n1;
}
randomRange(1,45)
이렇게 사용하면 된다
가중치가 적용 된 범위에서 숫자를 추출하려면?
예를 들어
"ball":25%
"strike":70%
"wild pitch":5%
이런 확률 속에서 랜덤하게 추출하는 것이다
public static <E> E getWeightedRandom(Map<E, Double> weights, Random random) {
E result = null;
double bestValue = Double.MAX_VALUE;
for (E element : weights.keySet()) {
double value = -Math.log(random.nextDouble()) / weights.get(element);
if (value < bestValue) {
bestValue = value;
result = element;
}
}
return result;
}
이렇게 사용
Map<String, Double> w = new HashMap<String, Double>();
w.put("ball", 25D);
w.put("strike", 70D);
w.put("wild pitch", 5D);
Random rand = new Random();
System.out.prinln(getWeightedRandom(w, rand));
javascript 버전
function getRandRange(min,max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function getRandWeight(listItem){
var pickVal = Number.MAX_VALUE;
var pickItem = null;
for(var item in listItem){
if(listItem.hasOwnProperty(item)){
var tmpVal = -Math.log(Math.random()) / listItem[item];
if(tmpVal < pickVal){
pickVal = tmpVal;
pickItem = item;
}
}
}
return pickItem;
}
$(document).ready(function(){
var listItem = [];
listItem["ball"] = 25;
listItem["strike"] = 70;
listItem["wild"] = 5;
var pickItem = getRandWeight(listItem);
console.log("pickItem",pickItem);
});