【问题标题】:Java random with low percentage on boolean array (quantile function)布尔数组(分位数函数)上百分比较低的 Java 随机数
【发布时间】:2015-05-29 14:45:01
【问题描述】:

我有一个大约 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...
    }
}

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

【问题讨论】:

  • 您能提供更多代码吗?什么是固定和基因型?
  • 对不起,那是错误的。已更正
  • 您可以简单地创建 (0.1 * 10000) 随机整数,其值介于 0 和 9999 之间:然后这些将完全成为您正在寻找的索引(并切换基于这些索引的布尔值将是微不足道且有效的)。
  • 我不知道整数是否比生成双精度数更快。好吧,如果是的话,那么使用它们可能会很好,但是我更愿意只获得一个随机数,代表布尔值的数量以对应于给定的百分比进行更改,这样如果百分比为 50%(说明性)而不是 0.005% 而不是 50%)我最常得到 5000。或者一些类似的算法或函数。
  • Marco:是的,问题是,这不是概率的运作方式,有可能不会改变任何一个,以及是否有可能所有人都会改变(好吧,即使忽略这些极端且并非完全可取的情况,应该在数量上有所偏差)

标签: java arrays random boolean


【解决方案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 次数少得多。

【讨论】:

  • 非常感谢。我一直在寻找代码的第一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2020-05-29
相关资源
最近更新 更多