当前位置:   article > 正文

用java代码实现权重分配_java权重

java权重

权重分配可以有多种实现方式,这里提供一种基于概率的实现方式,使用Java语言编写代码。

假设有n个元素需要进行权重分配,每个元素有一个权重值,权重值可以是任意正整数。我们需要将这n个元素按照权重值进行分配,使得权重值越大的元素被选中的概率越大。

算法思路如下:

计算所有元素的权重值之和,记为totalWeight。

生成一个随机数rand,范围为[1, totalWeight]。

遍历所有元素,累计它们的权重值,如果累计值大于等于rand,则选择该元素。

如果所有元素的权重值之和为0,则返回null,表示无法进行权重分配。

Java代码实现如下:

import java.util.List;
import java.util.Random;

public class WeightedRandomSelector<T> {
    private final List<Entry<T>> entries;
    private final Random rand;
    private int totalWeight;

    public WeightedRandomSelector(List<Entry<T>> entries) {
        this.entries = entries;
        this.rand = new Random();
        this.totalWeight = 0;
        for (Entry<T> entry : entries) {
            this.totalWeight += entry.weight;
        }
    }

    public T select() {
        if (totalWeight == 0) {
            return null;
        }
        int randNum = rand.nextInt(totalWeight) + 1;
        int accumulatedWeight = 0;
        for (Entry<T> entry : entries) {
            accumulatedWeight += entry.weight;
            if (accumulatedWeight >= randNum) {
                return entry.item;
            }
        }
        return null;
    }

    private static class Entry<T> {
        public T item;
        public int weight;

        public Entry(T item, int weight) {
            this.item = item;
            this.weight = weight;
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

使用示例:

import java.util.Arrays;
import java.util.List;

public class WeightedRandomSelectorTest {
    public static void main(String[] args) {
        List<WeightedRandomSelector.Entry<String>> entries = Arrays.asList(
                new WeightedRandomSelector.Entry<>("apple", 2),
                new WeightedRandomSelector.Entry<>("banana", 3),
                new WeightedRandomSelector.Entry<>("orange", 5)
        );
        WeightedRandomSelector<String> selector = new WeightedRandomSelector<>(entries);
        for (int i = 0; i < 10; i++) {
            String selected = selector.select();
            System.out.println("Selected: " + selected);
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

输出

Selected: orange
Selected: orange
Selected: banana
Selected: orange
Selected: orange
Selected: apple
Selected: orange
Selected: orange
Selected: orange
Selected: orange

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这个示例中,权重值较大的元素(如orange)被选中的概率较大,权重值较小的元素(如apple)被选中的概率较小。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/289156
推荐阅读
相关标签
  

闽ICP备14008679号