【问题标题】:weighted random selection in java? [duplicate]java中的加权随机选择? [复制]
【发布时间】:2021-01-23 13:48:50
【问题描述】:

我可以在不使用外部库的情况下在 java 中执行以下操作吗?也许使用 if-else 语句? 谢谢

import random

print(random.choices(['A', 'B', 'C'], [0.5, 0.3, 0.2]))

【问题讨论】:

    标签: java random


    【解决方案1】:

    当然。所需工具有:

    • java.util.Random 的一个实例
    • 调用它的nextDouble方法。

    算法类似于:

    • 首先一次性计算增量权重。在您的示例中,这将是 [0.5, 0.8, 1.0]
    • nextDouble 的输出乘以最终权重(此处最终权重为 1.0,因此不需要。当然,乘以 1.0 也无妨)。
    • 遍历增量权重并检查您拥有的随机数是否小于它。如果是,那是您的选择。

    例子:

    public class WeightedList {
        private final char[] choices;
        private final double[] weights;
        private final Random rnd = new Random();
    
        public WeightedList(char[] choices, double[] weights) {
            if (choices.length != weights.length) throw new IllegalArgumentException();
            this.choices = Arrays.copyOf(choices);
            this.weights = new double[weights.length];
            double s = 0.0;
            for (int i = 0; i < weights.length; i++) {
                this.weights[i] = (s += weights[i]);
            }
        }
    
        public char get() {
            double v = rnd.nextDouble() * weights[weights.length - 1];
            for (int i = 0; i < weights.length - 1; i++) {
                if (v < weights[i]) return choices[i];
            }
            return weights[weights.length - 1];
        }
    }
    

    【讨论】:

    • 编辑:我使代码(特别是get() 方法)更漂亮了一点。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2015-07-05
    • 2010-09-08
    • 2011-06-05
    • 2020-01-22
    • 2017-12-26
    相关资源
    最近更新 更多