java - Alias 方法的开源实现

标签 java statistics random probability

我现在正在做一个项目,为了代码重用,我去寻找一个可以执行某些项目的概率接受/拒绝的库:

即有三个人(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/

相关文章:

Java:随机化方法递归调用的顺序

Java 和 Espresso - 无法输入,需要支持输入法或可从类 : class SearchView 分配

java - DCEVM java 补丁不起作用

python - Python 中的 Kolmogorov-Smirnov 拟合优度检验

actionscript-3 - 如何循环遍历帧号,如果为真则忽略该帧号?

c++ - 优化 C++11 随机生成器的使用

java - 如何避免在包含的 JSP 文件中重新声明标签库?

java - Apache POI——读取修改excel文件

hadoop - Hive 中的计算统计模式

sql-server - 包含的列用于 Seek 运算符