如何在 Java 中保持多次执行的概率

How can I maintain probability across multiple executions in Java

首先我不是最擅长数学的,所以请原谅任何与此相关的无知。我试图在多次执行中保持基于概率的随机性,但我失败了。我在 JSONObject

中有这个输入
{
   "option1": 25,
   "option2":25,
   "option3" :10,
   "option4" :40
}

这是我的函数,它根据分配的概率从上面的 JSONObject 中选择一个值:

public static String selectRandomoptions(JSONObject options) {
    String selectedOption = null;

    if (options != null) {

        int maxChance = 0;
        for (String option : options.keySet()) {
            maxChance += options.getInt(option);
        }

        if (maxChance < 100) {
            maxChance = 100;
        }

        Random r = new Random();
        Integer randomValue = r.nextInt(maxChance);

        int chance = 0;
        for (String option : options.keySet()) {
            chance += options.getInt(option);
            if (chance >= randomValue) {
                selectedOption = options.toLowerCase();
                break;
            }
        }
    }
}

如果我在单次执行中调用它 x 次(测试 100 多次调用),该函数的行为在合理的误差范围内,问题是我 运行 每小时生成一些样本事件驱动应用程序中的数据来验证我们的分析 process/data 但我们需要它在某种程度上是可预测的,至少在合理的范围内?

有人知道我该如何处理吗?我宁愿不必坚持任何事情,但如果有意义或减少 complexity/time.

我不反对

Random.nextInt()返回的值是均匀分布的,所以这应该不是问题。

如果您想使随机结果可重复,那么您可能需要使用 Random with seed

与其每次需要一个新的随机数时都创建一个新的 Random() 对象,不如每次 运行 创建一次 Random 对象,然后每个 [=25] 使用一次 Random.nextInt() 对象=].

查看 Random() 构造函数的文档,

This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.it only guarantees it to be different

这比你从 nextInt() 得到的数字要弱一些。

如果要在每个 运行 上获得相同的数字序列,请使用随机对象的 Random(long seed)setSeed(long seed) 方法。这两种方法都设置了生成器的种子。如果您为每次调用使用相同的种子,则可以保证您将从生成器中获得相同的数字序列。 Random.setSeed(long).