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

29

我需要生成一些随机布尔值,但是我需要能够指定返回 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)方法。


6
你在寻找什么样的“更好”呢?我认为那看起来很合理...... - Jon Skeet
1
这是两个(本质上)不同的问题,因此应该在两个单独的帖子中提问... - Oliver Charlesworth
@JonSkeet 我想我希望有类似于 Random.nextBoolean(long probability) 的东西。 - diestl
我已经删除了你的第二个问题,请单独发布以获得答案。同时,我还投票关闭了这个问题,因为它主要基于观点。 - Duncan Jones
谢谢。我会编辑问题,使其不那么基于个人观点。 - diestl
9个回答

10

我在想,是否有更好或更自然的方法来做这件事。

目前您所使用的方法已经很好了。

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


* 仅适用于非加密目的。


@Baadshah:嗯,是的。我已经重新措辞了! - Oliver Charlesworth

4

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;

4
三元运算符是完全冗余的。为什么不直接使用 boolean true20 = (random.nextInt(5) == 0) ? - Oneiros
你知道当你学习新事物时,它在任何情况下都很有用吗?我完全同意这是多余的。 - bobanahalf

1

MockNeat库实现了此功能。

生成一个有99.99%几率为true的boolean值的示例:

MockNeat m = MockNeat.threadLocal();
boolean almostAlwaysTrue = m.bools().probability(99.99).val();

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

这个是基于百分比的...


-1
扩展user2495765的答案,您可以编写一个函数,该函数接受输入比率(作为两个值chance:range,请参见代码)。
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()。

-1
这是一个基于给定概率生成布尔值的 Kotlin 函数:
import kotlin.random.Random

fun generateBooleanWithProbability(probability: Double): Boolean {
    require(probability >= 0.0 && probability <= 1.0) { "Probability must be between 0 and 1" }
    return Random.nextDouble() < probability
}

fun main() {
    val probability = 0.7 // Adjust this value to set your desired probability
    val result = generateBooleanWithProbability(probability)
    println("Generated boolean value: $result")
}

在这个例子中,generateBooleanWithProbability函数接受一个概率参数,该参数应该是一个介于0和1之间的值。该函数使用Random.nextDouble()生成介于0(包括)和1(不包括)之间的随机double值,然后将其与给定的概率进行比较。如果随机值小于概率,则函数返回true,否则返回false。
请记得在主函数中调整概率值以设置你所期望生成的布尔值的概率。

-2

随机对象需要已经初始化。

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

验证是合理的,其余部分会使代码变得不必要地难以阅读。保持简单。 - Oneiros

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

或者对于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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接