以不同的概率随机选择一个对象

时间:2017-01-31 18:48:04

标签: java arraylist random

我有以下问题:

我需要从List中选择一个随机对象。如果所有元素都有相同的机会被选中,这很简单。

就我而言,挑选对象的可能性存储在另一个List中。所以我需要一个方法,它根据另一个List从列表中随机选择一个元素。

修改 E.g。

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

现在我希望Stringone”和“two”有四分之一的可能性和Stringthree”有两分之一的机会。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

你可以TreeMap使用当前总数的先前概率作为关键字并作为相应对象的值,然后在01之间生成一个随机数,最后使用{ {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'

所以这里:

  1. 如果随机值低于或等于0.25,我们将获得&#34; one&#34;。
  2. 如果随机值介于0.25(已排除)和0.50(已包含)之间,我们将获得&#34; two&#34;。
  3. 如果随机值介于0.50(已排除)和1.0(已包含)之间,我们将获得&#34; three&#34;。
  4. 感谢nextDouble()double0.0之间返回1.0均匀分布这一事实,这足以让我们获得预期分配。