根据每个数字的概率创建带边界的数字

时间:2016-03-29 01:22:43

标签: java random numbers probability

我想每次根据概率创建一些数字。

示例:

数字来自:1-5

  

数字1有可能被创建0.55,

     

数字2有可能被0.25,

     

数字3有可能被0.10,

     

第4号的概率为0.05,

     

第5号的概率为0.05

在这种情况下,它通常必须创建数字1,通常为2,有时为3,很少为4或5

所以,“方法”:create_the_numbers(int ending_number)应该像这个pseado-code:

public int create_the_numbers(int ending_number){
return probability(Random.getInt(ending_number))
}

这里有一个关于C#的问题:Probability Random Number Generator

2 个答案:

答案 0 :(得分:0)

我相信你在问如何加权概率。一种简单的方法如下:

int getWeightedRandomInt(double... weights) {
    final Random random = new Random();
    double val = random.nextDouble();
    for (int i = 0; i < weights.length; i++) {
        if (val < weights[i])
            return i;
    }
    throw new IllegalArgumentException("badly formed weights");
}

通过传递已排序的累积权重来使用它。在您的示例中:

getWeightedRandomInt(0.55, 0.8, 0.9, 0.95, 1.0);

如果您使用的是Java 8:

Arrays.stream(weights).filter(w -> val < w)
    .findFirst().orElseThrow(IllegalArgumentException::new);

答案 1 :(得分:0)

以下方法将执行此操作:

private static int get() {
    double d = Math.random();
    if (d < 0.55) return 1; // 0.55
    if (d < 0.80) return 2; // 0.25
    if (d < 0.90) return 3; // 0.10
    if (d < 0.95) return 4; // 0.05
    return 5;               // 0.05
}

使用Math.random()很简单,但有其局限性。阅读javadoc。或者,使用Random