我有以下问题:
我需要从List
中选择一个随机对象。如果所有元素都有相同的机会被选中,这很简单。
就我而言,挑选对象的可能性存储在另一个List
中。所以我需要一个方法,它根据另一个List
从列表中随机选择一个元素。
修改 E.g。
List<String> objects = Arrays.asList("one","two","three");
List<Double> chance = Arrays.asList(0.25, 0.25, 0.5);
现在我希望String
“one
”和“two
”有四分之一的可能性和String
“three
”有两分之一的机会。
感谢您的任何建议。
答案 0 :(得分:2)
你可以TreeMap
使用当前总数的先前概率作为关键字并作为相应对象的值,然后在0
和1
之间生成一个随机数,最后使用{ {3}}获取与第一个键相对应的对象,该对象大于或等于当前随机值。
类似的东西:
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
,我们将获得&#34; one
&#34;。0.25
(已排除)和0.50
(已包含)之间,我们将获得&#34; two
&#34;。0.50
(已排除)和1.0
(已包含)之间,我们将获得&#34; three
&#34;。感谢nextDouble()
在double
和0.0
之间返回1.0
值均匀分布这一事实,这足以让我们获得预期分配。