JAVA : 随机生成具有概率的整数

JAVA : generate integer numbers randomly with probabilities

如果数字范围从(150), 如果数字范围从 (50100)?

, 概率为 70%
int integer = new Random().nextInt(100) + 1;

// Probabilities
   ..... code here ....

我该怎么做?

这里有一个方法getRandom(),它returns一个满足您指定标准的随机数。它实际上使用 09 之间的随机数来确定使用两个范围中的哪一个。

public int getRandom() {
    Random random = new Random();
    int val = random.nextInt(10);

    if (val < 3) {
        return random.nextInt(50) + 1;      // random range 1 to 50
    }
    else {
        return random.nextInt(51) + 50;     // random range 50 to 100
    }
}

这是一个通用解决方案,它将 return 任意数量的事件之一,您可以在其中指定事件的相对权重。权重可以是概率,但不是必须的;它们不必加起来为 1。例如,如果您有三个事件,并且您希望第一个事件的概率为 20%,第二个概率为 30%,第三个概率为 50%,您可以调用 addEvent 在每个事件上使用 2、3 和 5 作为第二个参数,或 20、30 和 50,或 0.2、0.3 和 0.5,或具有这些比率的任何其他数字组合。对于您的情况,您可以将通用参数设为一个间隔并添加两个权重为 3 和 7(或 30 和 70,或其他)的事件;然后,当您调用 randomEvent 并且它 return 是一个具有端点 mn 包含 的区间时,您会生成另一个该区间内的随机数:

value = m + random.nextInt(n - m + 1);

其中 random 是您自己的 Random 实例。

class RandomDistribution<T> {

    private class Event {
        public final T event;
        public final double relativeWeight;
        public Event(T event, double relativeWeight) {
            this.event = event;
            this.relativeWeight = relativeWeight;
        }
    }

    private double totalWeight = 0D;
    private ArrayList<Event> events = new ArrayList<>();
    private Random generator = new Random();

    public void addEvent(T event, double relativeWeight) {
        events.add(new Event(event, relativeWeight));
        totalWeight += relativeWeight;
    }

    public T randomEvent() {
        double random = generator.nextDouble() * totalWeight;
        for (Event event : events) {
            random -= event.relativeWeight;
            if (random < 0D) {
                return event.event;
            }
        }
        // It's possible to get here due to rounding errors
        return events.get(events.size() - 1).event;
    }

}

您可以使用MockNeat probabilities()方法。

String s = mockNeat.probabilites(String.class)
                .add(0.1, "A")
                .add(0.2, "B")
                .add(0.5, "C")
                .add(0.2, "D")
                .val();

以上示例将生成 "A" 的概率为 10%,B 的概率为 20%,依此类推。

Integer x = m.probabilites(Integer.class)
         .add(0.2, m.ints().range(0, 100))
         .add(0.5, m.ints().range(100, 200))
         .add(0.3, m.ints().range(200, 300))
         .val();

以上示例将生成 [0, 100) 范围内的数字,概率为 20%,[100, 200) 范围内的数字,概率为 50%,以及 [200, 300) 范围内的数字有 30% 的概率。

免责声明:我是图书馆的作者,所以我在推荐它时可能会有偏见。