如何在Java

时间:2017-05-30 20:55:06

标签: java math random probability

首先,我不是最好的数学,所以请原谅与此有关的任何无知。我试图在多次执行中保持基于概率的随机性,但我失败了。我在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次以上的调用),该函数在合理的误差范围内行为,问题是我每小时运行一次以在事件驱动中生成一些示例数据应用程序来验证我们的分析过程/数据,但我们需要它在某种程度上可预测,至少在合理的范围内?

有谁知道如何处理这个问题?我宁愿不要坚持任何事情,但如果它有意义或减少复杂性/时间,我不反对它。

2 个答案:

答案 0 :(得分:3)

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

我想让随机结果可重复,然后您可能想要使用Random with seed

答案 1 :(得分:2)

不是每次想要一个新的随机数时都创建一个新的Random()对象,只需每次运行创建一次Random对象,并在每次运行时使用Random.nextInt()个对象。

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

  

此构造函数将随机数生成器的种子设置为a   值很可能与其他任何调用都不同   constructor.it只保证它不同

这是一个比nextInt()得到的数字更弱的合同。

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