如何根据概率选择项目?

2022-08-31 13:35:02

我有一个项目列表。这些项目中的每一个都有自己的概率。

任何人都可以建议一种算法来根据它的概率来选择一个项目吗?


答案 1
  1. 生成均匀分布的随机数。
  2. 循环访问列表,直到访问元素的累积概率大于随机数

示例代码:

double p = Math.random();
double cumulativeProbability = 0.0;
for (Item item : items) {
    cumulativeProbability += item.probability();
    if (p <= cumulativeProbability) {
        return item;
    }
}

答案 2

因此,对于每个项目存储一个标记其相对概率的数字,例如,如果您有3个项目,则选择其中一个项目的可能性应该是其他两个项目的两倍,那么您的列表将具有:

 [{A,1},{B,1},{C,2}]

然后对列表的数字求和(在我们的例子中为4)。现在生成一个随机数并选择该索引。int index = rand.nextInt(4);返回数字,使索引在正确的范围内。

Java 代码:

class Item {
    int relativeProb;
    String name;

    //Getters Setters and Constructor
}

...

class RandomSelector {
    List<Item> items = new List();
    Random rand = new Random();
    int totalSum = 0;

    RandomSelector() {
        for(Item item : items) {
            totalSum = totalSum + item.relativeProb;
        }
    }

    public Item getRandom() {

        int index = rand.nextInt(totalSum);
        int sum = 0;
        int i=0;
        while(sum < index ) {
             sum = sum + items.get(i++).relativeProb;
        }
        return items.get(Math.max(0,i-1));
    }
}

推荐