IT_Programming/Java

[Java] 범위 지정 랜덤 & 가중치 랜덤

JJun ™ 2009. 5. 30. 10:24



 출처: http://milktea.80port.net/index.php?document_srl=194&mid=Study




지정 된 범위에서 랜덤하게 숫자 하나를 뽑아내려 할 때

예를 들어 1에서 45사이의 숫자 중에 랜덤하게 하나를 뽑아내려 한다면


  randomRange(1,45)


이렇게 사용하면 된다


범위 지정 random 함수
1
2
3
public int randomRange(int n1, int n2) {
  return (int) (Math.random() * (n2 - n1 + 1)) + n1;
}




가중치가 적용 된 범위에서 숫자를 추출하려면?


예를 들어


"ball" : 25%

"strike" : 70%

"wild pitch" : 5%


이런 확률 속에서 랜덤하게 추출하는 것이다


가중치 random
1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}


사용법은 이렇게

1
2
3
4
5
6
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));


랜덤하게 ball, strike, wild pitch 세 가지 중에 하나가 나올 것이다