Java随机,布尔数组的百分比较低(分位数函数)

时间:2015-03-25 18:45:21

标签: java arrays random boolean

我有一个aproximattely 10 000元素的布尔数组。我想用相当低的设置概率(cca 0,1-0,01)来改变元素的值,同时知道更改元素的索引。想到的代码就像:

int count = 10000;
Random r = new Random();
for (int i = 0; i < count; i++) {
    double x = r.nextDouble();
    if (x < rate) {
            field[i]=!field[i];
            do something with the index...
    }
}

然而,当我在更大的循环(不可避免地)中这样做时,这很慢。我能想出的唯一另一种可能性是使用分位数函数(高斯数学),但是我还没有找到任何可以免费使用的代码或库。你有什么好主意如何解决这个问题,或者任何可以使用的库(标准最好)?

1 个答案:

答案 0 :(得分:1)

基本上,您已使用n == countp == rate设置了二项式模型。您应获得的相关值数x可以建模为具有中心n*p == count*rate和标准差sigma == Math.sqrt(p*(1-p)/n) == Math.sqrt(rate * (1-rate) / count)的普通模型。

您可以轻松计算

int x = (int) Math.round(Math.sqrt(rate * (1-rate) / count)
        * r.nextGaussian() + count * rate)

然后,您可以使用以下代码在范围内生成x个随机数。

Set<Integer> indices = new HashSet<Integer>();
while(indices.size() < x){
     indices.add(r.nextInt(count));
}

indices现在将包含正确的索引,您可以根据需要使用它们。

您只需拨打nextIntx次,这应该比您之前调用它的时间少count次。