繁体   English   中英

如何在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次以上),该函数的行为就在合理的误差范围内,问题是我每小时运行一次,以在事件驱动的应用程序中生成一些示例数据以进行验证我们的分析过程/数据,但我们需要至少在合理范围内可预测的东西?

有谁知道我该如何处理? 我宁愿不必坚持任何措施,但我不反对这样做,如果这样做有意义或减少了复杂性/时间。

Random.nextInt()返回的值是均匀分布的,因此这不应该成为问题。

我想使随机结果可重复,那么您可能要对种子使用Random

不必每次需要一个新的随机数时都创建一个新的Random()对象,而是每次运行一次创建Random对象,然后每次运行一次使用Random.nextInt()对象。

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

这个构造函数将随机数生成器的种子设置为一个很可能与该构造函数的任何其他调用不同的值,它仅保证它是不同的

这比您从nextInt()获得的合同nextInt()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM