我需要生成一些随机的布尔值。但是我需要能够指定返回true
的概率。结果如下:
private Random random = new Random();
random.nextBoolean();
无效。
一种可能的解决方案是:
private Random random = new Random()
public boolean getRandomBoolean(float p){
return random.nextFloat() < p;
}
我想知道是否有更好或更自然的方式来做这件事。
编辑: 我想我在问是否有一个提供nextBoolean(浮点概率)方法的库类。
答案 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;
}