Java Alias方法的开源实现
我目前正在做一个项目,为了代码重用,我去寻找一个库,它可以执行某种概率的项目接受/拒绝: i、 例如,有三个人(a,bc),他们每个人都有得到一个项目的概率p{i},其中p{a}表示a的概率。这些概率是在运行时计算的,不能硬编码Java Alias方法的开源实现,java,statistics,random,probability,Java,Statistics,Random,Probability,我目前正在做一个项目,为了代码重用,我去寻找一个库,它可以执行某种概率的项目接受/拒绝: i、 例如,有三个人(a,bc),他们每个人都有得到一个项目的概率p{i},其中p{a}表示a的概率。这些概率是在运行时计算的,不能硬编码 我想做的是生成一个随机数(对于一个项目),并根据获得该项目的概率计算谁获得该项目。这里概述的alias方法()解释了如何实现,但我想看看是否有现成的实现,这样我就不必编写它了。这样做可以吗?将所有p{i}放在数组中,函数将向获取该项的人返回一个索引。在O(n)中执行 p
我想做的是生成一个随机数(对于一个项目),并根据获得该项目的概率计算谁获得该项目。这里概述的alias方法()解释了如何实现,但我想看看是否有现成的实现,这样我就不必编写它了。这样做可以吗?将所有p{i}放在数组中,函数将向获取该项的人返回一个索引。在O(n)中执行
public int selectPerson(float[]概率,随机r){
float t=r.nextFloat();
浮动p=0.0f;
for(int i=0;i
编辑:我还没有真正测试过这个。我的观点是,您描述的函数不是很复杂(如果我正确理解您的意思的话),您不需要下载库来解决这个问题。我刚刚测试了上述方法-它并不完美,但我想就我的目的而言,它应该足够了。(groovy中的代码,粘贴到单元测试中…)
void测试(){
对于(int i=0;i<10;i++){
一次
}
}
私有def once(){
def双[]问题=[1/11、2/11、3/11、1/11、2/11、2/11]
def int[]whoccounts=新int[probs.length]
def Random r=新随机数()
定义int谁
整数倍=1000000
for(int i=0;i
这里是一个Ruby实现:请注意,这不是别名方法。有关可以轻松移植到Java的C#实现,请参阅。
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;
}
void test() {
for (int i = 0; i < 10; i++) {
once()
}
}
private def once() {
def double[] probs = [1 / 11, 2 / 11, 3 / 11, 1 / 11, 2 / 11, 2 / 11]
def int[] whoCounts = new int[probs.length]
def Random r = new Random()
def int who
int TIMES = 1000000
for (int i = 0; i < TIMES; i++) {
who = selectPerson(probs, r.nextDouble())
whoCounts[who]++
}
for (int j = 0; j < probs.length; j++) {
System.out.printf(" %10f ", (probs[j] - (whoCounts[j] / TIMES)))
}
println ""
}
public int selectPerson(double[] probabilies, double r) {
double t = r
double p = 0.0f;
for (int i = 0; i < probabilies.length; i++) {
p += probabilies[i];
if (t < p) {
return i;
}
}
return probabilies.length - 1;
}
outputs: the difference betweenn the probability, and the actual count/total
obtained over ten 1,000,000 runs:
-0.000009 0.000027 0.000149 -0.000125 0.000371 -0.000414
-0.000212 -0.000346 -0.000396 0.000013 0.000808 0.000132
0.000326 0.000231 -0.000113 0.000040 -0.000071 -0.000414
0.000236 0.000390 -0.000733 -0.000368 0.000086 0.000388
-0.000202 -0.000473 -0.000250 0.000101 -0.000140 0.000963
0.000076 0.000487 -0.000106 -0.000044 0.000095 -0.000509
0.000295 0.000117 -0.000545 -0.000112 -0.000062 0.000306
-0.000584 0.000651 0.000191 0.000280 -0.000358 -0.000181
-0.000334 -0.000043 0.000484 -0.000156 0.000420 -0.000372