如何实现事件的概率< Java中的1/2?

时间:2013-11-05 15:07:17

标签: java random probability

我有一个小应用程序,我根据以下内容分配一些内存:

if (RANDOM.nextBoolean()) {
     // Allocate some memory here.
}

为了提高覆盖率,单元测试重复多次,JVM抱怨没有堆空间。分配没有前提条件,我只想要一些随机分发并避免错误消息。

是否有办法实现内存分配的概率< 1/2?

4 个答案:

答案 0 :(得分:3)

e.g。约1/4的机会

if (RANDOM.nextDouble() < 0.25) {
     // Allocate some memory here.
}

相应地调整要比较的值。 nextDouble()返回0.0到1.0之间的值

答案 1 :(得分:1)

是的,例如,概率小于1/2:

if (RANDOM.nextBoolean() && RANDOM.nextBoolean()) {
}

答案 2 :(得分:1)

使您的随机源成为可以传递到使用它的类的外部实例。在测试中,将其作为模拟对象传递。您将能够控制模拟对象的行为,以便为测试返回可预测的结果。然后,您可以为测试提供任何您想要的概率。

例如:

public class MyClass {
    private final BooleanRandom bRandom;

    public MyClass(BooleanRandom bRandom) {
        this.bRandom = bRandom;
    }

    public void doTheMemoryThing() {
        if (bRandom.nextBoolean()) {
            allocateMemory();

    }
}

在您的测试中,使用Mockito:

BooleanRandom br = mock(BooleanRandom.class);
when(br.nextBoolean()).thenReturn(true);  // or false, as needed
MyClass mc = new MyClass(br);
// test
mc.doTheMemoryThing();

doTheMemoryThing的调用中,您知道测试将通过。在其他情况下,您可以nextBoolean返回false,以便不分配内存。

答案 3 :(得分:0)

对此更常见的解决方案是使用您想要的任何概率,在此示例中,有13%的时间需要真值:

public static final boolean getRandomTrue(final double probability) {
    return java.util.concurrent.ThreadLocalRandom.current().nextDouble() < probability;
}


private static final double PERCENT13 = 13/100.0

然后,在其他一些代码上,你可以这样做:

if (getRandomTrue(PERCENT13)) {
    // do someting 13% of the time....
}