Java 带权重或偏差的随机布尔值
我需要生成一些随机布尔值。但是,我需要能够指定返回Java 带权重或偏差的随机布尔值,java,random,probability,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; } private Random=
true
的概率。结果是:
private Random random = new Random();
random.nextBoolean();
这是行不通的
一种可能的解决办法是:
private Random random = new Random()
public boolean getRandomBoolean(float p){
return random.nextFloat() < p;
}
private Random=new Random()
公共布尔getRandomBoolean(浮点p){
返回random.nextFloat()
我想知道是否有更好或更自然的方法来做到这一点
编辑:
我想我是在问是否有一个库类提供了nextBoolean(float probability)方法
我想知道是否有更好或更自然的方法来做到这一点
您正在使用的方法已经很好了
*据我所知,没有一种标准的Java方法可以使代码变得更短
*对于非加密目的。1)是的,我认为你的方法是有效的,我看不到其他更简单的方法 2) 有一个用于处理不同统计分布的随机数的库:
您的方式可能更好,但另一种方式是:
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;
}
公共静态布尔flipRandom(双概率){
验证.isBetween(概率,0,1,真);
如果(概率==0)
返回false;
如果(概率==1)
返回true;
如果(概率==0.5)
返回random.nextBoolean();
返回random.nextDouble()<概率?true:false;
}
这个是基于百分比…这是我使用的。与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;
Random Random=new Random();
//20%的机会
布尔值true20=(random.nextInt(5)=0)?真:假;
//25%的机会
布尔值true25=(random.nextInt(4)=0)?真:假;
//40%的机会
布尔值true40=(random.nextInt(5)<2)?真:假;
扩展用户2495765的答案,
您可以创建一个采用输入比率的函数(作为两个值:范围参见代码)
}
根据您打算执行的操作,您可能不希望从方法中初始化Random,而是将其用作类变量(如上面的代码所示),并从函数中调用nextInt()。库实现了此功能
生成99.99%为真的布尔值的示例:
MockNeat m = MockNeat.threadLocal();
boolean almostAlwaysTrue = m.bools().probability(99.99).val();
你在寻找什么样的“更好”?这对我来说似乎很合理……这是两个(本质上)独立的问题,因此应该在两个单独的帖子中提问…@JonSkeet我想我希望得到一些类似随机的东西。下一个问题(长概率)我已经删掉了你的第二个问题,如果你想得到答案,请单独发布。我也投票结束了这个问题,因为它主要是基于意见的。谢谢。我会编辑这个问题,这样它就不那么基于观点了。@Baadshah:嗯,是的。我现在已经改写了!验证是合理的,其余部分会使代码不必要地不可读。保持简单三元运算符是完全冗余的。为什么不干脆
boolean true20=(random.nextInt(5)==0)
?你知道当你学习新事物时,它在任何情况下都是有用的吗?我完全同意这是多余的。
public class MyRandomFuncs {
public Random rand = new Random();
boolean getBooleanAsRatio(int chance, int range) {
int c = rand.nextInt(range + 1);
return c > chance;
}
MockNeat m = MockNeat.threadLocal();
boolean almostAlwaysTrue = m.bools().probability(99.99).val();