Java 布尔数组上的低百分比随机(分位数函数)
Java random with low percentage on boolean array (quantile function)
我有一个包含大约 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...
}
}
但是,当我在更大的循环中(不可避免地)执行此操作时,速度很慢。我能想到的唯一其他可能性是使用分位数函数(高斯数学),但是我还没有找到任何免费使用的代码或库。您是否知道如何解决这个问题,或者可以使用任何库(最好是标准库)?
基本上,您已经建立了一个二项式模型,其中 n == count
和 p == 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
现在将包含正确的索引,您可以随意使用。
您只需调用 nextInt
多 x
次,这应该比您之前调用它的 count
次少得多。
我有一个包含大约 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...
}
}
但是,当我在更大的循环中(不可避免地)执行此操作时,速度很慢。我能想到的唯一其他可能性是使用分位数函数(高斯数学),但是我还没有找到任何免费使用的代码或库。您是否知道如何解决这个问题,或者可以使用任何库(最好是标准库)?
基本上,您已经建立了一个二项式模型,其中 n == count
和 p == 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
现在将包含正确的索引,您可以随意使用。
您只需调用 nextInt
多 x
次,这应该比您之前调用它的 count
次少得多。