【问题标题】:JAVA : generate integer numbers randomly with probabilitiesJAVA:以概率随机生成整数
【发布时间】:2016-01-26 08:44:18
【问题描述】:

如果数字范围从 (150),我如何以概率从 (1100) 随机生成整数,例如 30%,如果数字范围从(50100)?

int integer = new Random().nextInt(100) + 1;

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

我该怎么做?

【问题讨论】:

标签: java probability


【解决方案1】:

这是一个方法getRandom(),它返回一个满足您指定条件的随机数。它实际上使用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
    }
}

【讨论】:

  • 非常感谢@Tim Biegeleisen,这就是答案。
【解决方案2】:

这是一个通用解决方案,它将返回任意数量的事件之一,您可以在其中指定事件的相对权重。权重可以是概率,但不是必须的;它们不必相加为 1。例如,如果您有三个事件,并且您希望第一个事件的概率为 20%,第二个事件的概率为 30%,第三个事件的概率为 50%,您可以致电 addEvent on每个事件都以 2、3 和 5 作为第二个参数,或 20、30 和 50,或 0.2、0.3 和 0.5,或具有这些比率的任何其他数字组合。对于您的情况,您可以将通用参数设为区间并添加两个权重为 3 和 7(或 30 和 70,或其他)的事件;然后,当您调用randomEvent 时,它会返回一个端点为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;
    }

}

【讨论】:

    【解决方案3】:

    你可以使用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();
    

    上面的例子将以 10% 的概率生成“A”,以 20% 的概率生成 B,以此类推。

    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();
    

    上面的例子将以 20% 的概率生成范围 [0, 100) 中的数字,以 50% 的概率生成范围 [100, 200) 中的数字和范围 [200, 300) 中的数字 30百分比概率。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 2017-10-01
      • 2016-01-06
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多