26

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

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

不管用。

一种可能的解决方案是:

private Random random = new Random()

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

我想知道是否有更好或更自然的方法来做到这一点。

编辑:我想我在问是否有提供 nextBoolean(float probability) 方法的库类。

4

8 回答 8

10

我想知道是否有更好或更自然的方法来做到这一点。

您已经使用的方法很好。

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


* 用于非加密目的。

于 2013-06-28T07:54:45.630 回答
4

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

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

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

于 2013-06-28T08:05:30.600 回答
3

这是我正在使用的。非常类似于 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;
于 2016-06-21T15:49:34.980 回答
1
    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;}
      }

这个是按百分比...

于 2015-11-25T01:43:55.480 回答
1

MockNeat库实现了这个特性

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

MockNeat m = MockNeat.threadLocal();
boolean almostAlwaysTrue = m.bools().probability(99.99).val();
于 2018-03-09T09:06:57.223 回答
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() 。

于 2017-10-11T13:59:36.613 回答
-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;
    }
}

或者五分之二,试试这个:

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;
    }
}
于 2013-12-03T03:27:43.060 回答
-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;
}
于 2015-02-17T09:53:32.127 回答