【问题标题】:How to achieve probability of an event < 1/2 in Java?如何在Java中实现事件的概率<1/2?
【发布时间】:2013-11-05 15:07:16
【问题描述】:

我有一个小应用程序,我在其中分配一些内存:

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

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

有没有办法使内存分配的概率达到

【问题讨论】:

  • 您还可以将该条件放入受保护的方法中,并为您的单元测试覆盖它。这样您就可以更轻松地使您的测试变得可控和可重复。

标签: java random probability


【解决方案1】:

例如大约有 1/4 的机会

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

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

【讨论】:

    【解决方案2】:

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

    例如:

    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】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-20
          • 1970-01-01
          • 2021-01-28
          • 1970-01-01
          • 2018-02-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多