Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带权重或偏差的随机布尔值_Java_Random_Probability - Fatal编程技术网

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();