具有权重或偏差的随机布尔值

时间:2013-06-28 07:51:13

标签: java random probability

我需要生成一些随机的布尔值。但是我需要能够指定返回true的概率。结果如下:

private Random random = new Random();
random.nextBoolean();

无效。

一种可能的解决方案是:

private Random random = new Random()

public boolean getRandomBoolean(float p){
return random.nextFloat() < p;
}

我想知道是否有更好或更自然的方式来做这件事。

编辑: 我想我在问是否有一个提供nextBoolean(浮点概率)方法的库类。

8 个答案:

答案 0 :(得分:9)

  

我想知道是否有更好或更自然的方式来做这件事。

您正在使用的方法很好。

* 据我所知,没有一种标准的Java方法会使这段代码更短。

<小时/> *用于非加密目的。

答案 1 :(得分:4)

1)是的,我认为你的方法是有效的,我没有看到另一种更简单的方法。

2)有一个库用于处理不同统计分布的随机数:

http://introcs.cs.princeton.edu/java/22library/StdRandom.java.html

答案 2 :(得分:1)

这是我正在使用的。与FracturedRetina的答案非常相似。

Random random = new Random();

// 20% chance
boolean true20 = (random.nextInt(5) == 0) ? true : false;

// 25% chance
boolean true25 = (random.nextInt(4) == 0) ? true : false;

// 40% chance
boolean true40 = (random.nextInt(5) < 2) ? true : false;

答案 3 :(得分:1)

MockNeat库实现了此功能。

生成具有99.99%为真的布尔值的示例:

MockNeat m = MockNeat.threadLocal();
boolean almostAlwaysTrue = m.bools().probability(99.99).val();

答案 4 :(得分:0)

    public boolean getBiasedRandom(int bias) {
      int c;
      Random t = new Random();
     // random integers in [0, 100]
      c=t.nextInt(100);
      if (c>bias){return false;
      }
      else{return true;}
      }

这是基于百分比......

答案 5 :(得分:0)

扩展user2495765的答案, 你可以创建一个输入比率的函数(两个值机会:范围见代码)

public class MyRandomFuncs {
    public Random rand = new Random();

    boolean getBooleanAsRatio(int chance, int range) {
        int c = rand.nextInt(range + 1);
        return c > chance;
    }

}

根据您的意图,您可能不希望在方法中初始化Random,而是使用类变量(如上面的代码中所示)并从函数中调用nextInt()。

答案 6 :(得分:-1)

你的方式可能更好,代码高尔夫,但另一种方法是这样:

public boolean getRandomBoolean() {
    Random random = new Random();
    //For 1 in 5
    int chanceOfTrue = 5;

    if (random.nextInt(chanceOfTrue) == 0) {
        return true;
    } else {
        return false;
    }
}

或者对于5中的2,试试这个:

public boolean getRandomBoolean() {
    Random random = new Random();
    //For 2 in 5
    int chanceOfTrue = 5;
    int randInt = random.nextInt(chanceOfTrue);

    if (randInt == 0 || randInt == 1) {
        return true;
    } else {
        return false;
    }
}

答案 7 :(得分:-1)

随机对象需要初始化。

public static boolean flipRandom(double probability) {
    Validate.isBetween(probability, 0, 1, true);
    if(probability == 0)
        return false;
    if(probability == 1)
        return true;
    if(probability == 0.5)
        return random.nextBoolean();
    return random.nextDouble() < probability ? true : false;
}