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

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

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

不管用。

一种可能的解决方案是:

 private Random random = new Random() public boolean getRandomBoolean(float p){ return random.nextFloat() < p; } 

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

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

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

你正在使用的方法很好。 * AFAIK,没有标准的Java方法可以使这个代码更短。


*用于非加密目的。

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

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

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

MockNeat库实现了此function。

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

 MockNeat m = MockNeat.threadLocal(); boolean almostAlwaysTrue = m.bools().probability(99.99).val(); 
  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;} } 

这个基于百分比……

这是我正在使用的。 与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; 

扩展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()。

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

 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; } } 

随机对象需要初始化。

 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; }