출처: http://milktea.80port.net/index.php?document_srl=194&mid=Study
지정 된 범위에서 랜덤하게 숫자 하나를 뽑아내려 할 때
예를 들어 1에서 45사이의 숫자 중에 랜덤하게 하나를 뽑아내려 한다면
randomRange(1,45) |
이렇게 사용하면 된다
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%
이런 확률 속에서 랜덤하게 추출하는 것이다
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 세 가지 중에 하나가 나올 것이다
'IT_Programming > Java' 카테고리의 다른 글
[펌] Java 직렬통신 (0) | 2009.08.24 |
---|---|
Java 5의 새로운 기능 (0) | 2009.08.23 |
[펌] Java Serial Version ID (0) | 2009.05.22 |
[펌] 객체 직렬화(Object Serialization): (0) | 2009.05.12 |
J2SDK1.4에 추가된 nio로 비동기식 고가용성 서버 만들기 (0) | 2009.05.01 |