2017-01-31 5 views
0

나는 다음과 같은 문제가 있습니다다른 확률로 무작위로 개체를 선택

은 내가 List에서 임의의 객체를 선택해야합니다. 모든 요소가 선택 될 가능성이 높으면 간단합니다.

필자의 경우 개체를 선택할 확률은 다른 List에 저장됩니다. 그래서 난 List을 기반으로 목록에서 임의로 요소를 선택하는 메서드가 필요합니다.

편집 : 예 :

List<String> objects = Arrays.asList("one","two","three"); 
List<Double> chance = Arrays.asList(0.25, 0.25, 0.5); 

는 지금은 String " one"네 중 하나의 기회와이 중 하나의 기회로 String " three"와 " two"를 원한다.

감사합니다.

+0

귀하의 질문에 전혀 명확하지 않다, 일부 코드 또는 입력 결과를 공유 할 수 있습니까? –

+0

''똑같은 기회 (chance) '는 아이가 이미 선택한 구간을 선택하지 않았다는 것을 의미합니까? –

+0

귀하의 확률 합계를 1로 추정합니까? 그런 다음'Math.random()'을 사용하여 숫자'[0 .. 1]'을 선택하고 합계를 초과하는 첫 번째 요소를 찾을 때까지 아마'List'와 sum을 걷습니다. 해당 인덱스에서 항목을 반환하십시오. –

답변

2

당신 수 해당 개체 이전 확률과 값으로 현재 총, 후 첫 번째 키에 해당하는 개체를 가져 ceilingEntry(K key)를 사용하여 마지막으로 01 사이의 임의의 숫자를 생성하고, 같은 키를 가진 TreeMap 현재의 랜덤 값보다 크거나 같습니다.

뭔가 같은 :

List<String> objects = Arrays.asList("one","two","three"); 
List<Double> chance = Arrays.asList(0.25, 0.25, 0.5); 

// Build the tree map 
TreeMap<Double, String> map = new TreeMap<>(); 
double total = 0.0d; 
for (int i = 0; i < objects.size(); i++) { 
    map.put(total += chance.get(i), objects.get(i)); 
} 
System.out.printf("The generated is map %s%n", map); 

// The generator of random numbers 
Random generator = new Random(); 
// Generate a random value between 0 and 1 
double value = generator.nextDouble(); 
// Get the object that matches with the generated number 
String object = map.ceilingEntry(value).getValue(); 
System.out.printf("The current value is %f corresponding to '%s'%n", value, object); 

출력 : 그래서 여기

The generated map is {0.25=one, 0.5=two, 1.0=three} 
The current value is 0,048460 corresponding to 'one' 

: 임의의 값이 0.25으로 낮거나 같은 경우

  1. , 우리는 "one를 얻을 것이다 ".
  2. 랜덤 값이 0.25 (제외)와 0.50 (포함) 사이에있는 경우 "two"이됩니다.
  3. 랜덤 값이 0.50 (제외)와 1.0 (포함) 사이 인 경우 "three"이됩니다.

감사 nextDouble() 균일 0.01.0 사이을 분산 double을 반환하는 사실,이 예상 분포를 얻기에 충분하다.

+1

고맙습니다, 당신의 solutuion이 나를 위해 완벽하게 작동했습니다 – Jermano

+0

어떻게 List 을 사용할 수 있습니까? 난 그냥 오류가 발생 – TheCrazyProfessor

+0

어떤 종류의? –

관련 문제