당신 수 해당 개체 이전 확률과 값으로 현재 총, 후 첫 번째 키에 해당하는 개체를 가져 ceilingEntry(K key)
를 사용하여 마지막으로 0
와 1
사이의 임의의 숫자를 생성하고, 같은 키를 가진 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
으로 낮거나 같은 경우
이
- , 우리는 "
one
를 얻을 것이다 ".
- 랜덤 값이
0.25
(제외)와 0.50
(포함) 사이에있는 경우 "two
"이됩니다.
- 랜덤 값이
0.50
(제외)와 1.0
(포함) 사이 인 경우 "three
"이됩니다.
감사 nextDouble()
균일 0.0
및 1.0
사이을 분산 double
값 을 반환하는 사실,이 예상 분포를 얻기에 충분하다.
귀하의 질문에 전혀 명확하지 않다, 일부 코드 또는 입력 결과를 공유 할 수 있습니까? –
''똑같은 기회 (chance) '는 아이가 이미 선택한 구간을 선택하지 않았다는 것을 의미합니까? –
귀하의 확률 합계를 1로 추정합니까? 그런 다음'Math.random()'을 사용하여 숫자'[0 .. 1]'을 선택하고 합계를 초과하는 첫 번째 요소를 찾을 때까지 아마'List'와 sum을 걷습니다. 해당 인덱스에서 항목을 반환하십시오. –