我现在正在做一个项目,为了代码重用,我去寻找一个可以执行某些项目的概率接受/拒绝的库:
即有三个人(a, b, c),每个人都有获得某件元素的概率 P{i},其中 p{a} 表示 a 的概率。这些概率是在运行时计算的,不能进行硬编码。
我想做的是生成一个随机数(针对一件元素),并根据获得该元素的概率来计算谁获得该元素。这里概述的别名方法( http://books.google.com/books?pg=PA133&dq=alias+method+walker&ei=D4ORR8ncFYuWtgOslpVE&sig=TjEThBUa4odbGJmjyF4daF1AKF4&id=ERSSDBDcYOIC&output=html )解释了如何操作,但我想看看是否有现成的实现,这样我就不必编写它了。
最佳答案
这样的事情可以吗?将所有 p{i} 放入数组中,函数将返回一个索引给获取该项目的人。执行时间复杂度为 O(n)。
public int selectPerson(float[] probabilies, Random r) {
float t = r.nextFloat();
float p = 0.0f;
for (int i = 0; i < probabilies.length; i++) {
p += probabilies[i];
if (t < p) {
return i;
}
}
// We should not end up here if probabilities are normalized properly (sum up to one)
return probabilies.length - 1;
}
编辑:我还没有真正测试过这个。我的观点是,您描述的功能并不是很复杂(如果我理解正确的话),您不需要下载库来解决这个问题。
关于java - Alias 方法的开源实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/126656/