프로그램/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);
});