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

JAVA:随机生成具有概率的整数,java,probability,Java,Probability,如果数字从(1到100),我如何以概率从(1到50)随机生成整数,如果数字从(50到100)随机生成整数 我该怎么做呢?这里有一个方法getRandom(),它返回一个符合指定条件的随机数。它实际上使用一个介于0和9之间的随机数来确定使用这两个范围中的哪一个 public int getRandom() { Random random = new Random(); int val = random.nextInt(10); if (val < 3) {

如果数字从(
1
100
),我如何以概率从(
1
50
)随机生成整数,如果数字从(
50
100
)随机生成整数


我该怎么做呢?

这里有一个方法
getRandom()
,它返回一个符合指定条件的随机数。它实际上使用一个介于
0
9
之间的随机数来确定使用这两个范围中的哪一个

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
    }
}
public int getRandom(){
随机=新随机();
int val=random.nextInt(10);
if(val<3){
返回random.nextInt(50)+1;//随机范围1到50
}
否则{
返回random.nextInt(51)+50;//随机范围50到100
}
}

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

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;
    }

}
类随机分布{
私人课堂活动{
公开决赛;
公众最终双相对论权;
公共事件(T事件,双相对光){
this.event=事件;
this.relativewight=relativewight;
}
}
私人双倍总重量=0D;
私有ArrayList事件=新建ArrayList();
专用随机生成器=新随机();
公共无效添加事件(T事件,双相对光){
添加(新事件(事件,相对视图));
总重量+=相对重量;
}
公共事件(){
double random=生成器.nextDouble()*总重量;
对于(事件:事件){
随机-=事件相对光线;
if(随机<0D){
返回事件。事件;
}
}
//由于舍入误差,有可能到达这里
返回events.get(events.size()-1).event;
}
}
您可以使用方法

上述示例将生成概率为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]中的数字以及概率为30%的范围[200,300]中的数字


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

重复编辑:嗯,这很奇怪。如果你直接点击链接,它会显示404,但可以通过google@MichaelJames获得正确链接。这是一个中文网站@MichaelJames,你必须重复粘贴该链接吗?这些链接会重复两次非常有用。谢谢大家。非常感谢@Tim Biegeleisen这是答案。
String s = mockNeat.probabilites(String.class)
                .add(0.1, "A")
                .add(0.2, "B")
                .add(0.5, "C")
                .add(0.2, "D")
                .val();
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();