java - Java中的加权随机性

标签 java random

在 Java 中,给定 n 个项目,每个项目的权重 w,如何从集合中随机选择一个具有等于 w 机会的项目em>?

假设每个权重是从 0.0 到 1.0 的 double ,并且集合中的权重总和为 1。Item.getWeight() 返回项目的权重。

最佳答案

2020 年更新(有趣的是,这在下面的 2011 版本中获得了 37 次投票,但有一个明显的错误):

  • 修复了当 Math.random() 产生一个非常接近 1.0 的数字时无法选择最后一项的问题,并且我们在浮点精度方面不走运:随机索引结果是-1,这显然是错误的。
  • 一些代码压缩
  • 使用较少的变量名
Item[] items = ...;

// Compute the total weight of all items together.
// This can be skipped of course if sum is already 1.
double totalWeight = 0.0;
for (Item i : items) {
    totalWeight += i.getWeight();
}

// Now choose a random item.
int idx = 0;
for (double r = Math.random() * totalWeight; idx < items.length - 1; ++idx) {
    r -= items[idx].getWeight();
    if (r <= 0.0) break;
}
Item myRandomItem = items[idx];

2011版(留作比较):

Item[] items = ...;

// Compute the total weight of all items together
double totalWeight = 0.0d;
for (Item i : items)
{
    totalWeight += i.getWeight();
}
// Now choose a random item
int randomIndex = -1;
double random = Math.random() * totalWeight;
for (int i = 0; i < items.length; ++i)
{
    random -= items[i].getWeight();
    if (random <= 0.0d)
    {
        randomIndex = i;
        break;
    }
}
Item myRandomItem = items[randomIndex];

关于java - Java中的加权随机性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6737283/

相关文章:

Ruby:Random#rand 和 Kernel#rand 之间的区别

稀疏随机填充数组的 Pythonic 方法?

java - 如何使用 MOXy 将 Map 编码为 {key : value, key : value, ...}

java - readFully 未使用 Java Nashorn Javascript 引擎定义

python - 在 python 中,如何区分人类可读的单词和随机字符串?

python - 在非常具体的约束下生成随机数

C++ 生成不重复的随机数。输出屏幕只是空白,光标闪烁

java - 可以使用嵌入式 jetty 以编程方式设置上下文阀和 Realm 吗?

java - Spring如何在收到交易时刷新页面?

java - Java Bean 和企业 Java Bean 的区别?