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

如何实现事件的概率<;Java中的1/2?,java,random,probability,Java,Random,Probability,我有一个小应用程序,我根据以下内容分配一些内存: if (RANDOM.nextBoolean()) { // Allocate some memory here. } 为了提高覆盖率,单元测试会重复多次,JVM会抱怨堆空间不足。分配没有任何先决条件,我只想要一些随机分布并避免错误消息 有没有办法使内存分配的概率小于1/2?是的,例如,概率小于1/2: if (RANDOM.nextBoolean() && RANDOM.nextBoolean()) { } 是,例

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

if (RANDOM.nextBoolean()) {
     // Allocate some memory here.
}
为了提高覆盖率,单元测试会重复多次,JVM会抱怨堆空间不足。分配没有任何先决条件,我只想要一些随机分布并避免错误消息


有没有办法使内存分配的概率小于1/2?

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

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

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

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

e、 大约有1/4的机会

if (RANDOM.nextDouble() < 0.25) {
     // Allocate some memory here.
}
if(RANDOM.nextDouble()<0.25){
//在这里分配一些内存。
}

相应地调整要比较的值。()返回0.0到1.0之间的值,例如大约1/4的概率

if (RANDOM.nextDouble() < 0.25) {
     // Allocate some memory here.
}
if(RANDOM.nextDouble()<0.25){
//在这里分配一些内存。
}

相应地调整要比较的值。()返回从0.0到1.0的值,使随机性源成为一个外部实例,可以传递到使用它的类中。在测试中,将其作为模拟对象传递。您将能够控制模拟对象的行为,以便它为您的测试返回可预测的结果。然后你可以为你的测试做任何你想要的概率

例如:

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
时,您知道测试将通过。在其他情况下,您可以使用wirte
nextBoolean
返回
false
,这样内存就不会被分配。

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

例如:

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
,这样内存就不会被分配。

更通用的解决方案是使用您想要的任何概率,在本例中,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

一个更普遍的解决方案是使用任何你想要的概率,在本例中,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

您还可以将该条件放入受保护的方法中,并在单元测试中重写它。这样,您可以使测试更容易控制和重复。您还可以将该条件放入受保护的方法中,并为单元测试重写它。这样,您可以使测试更容易控制和重复。