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

Posted

技术标签:

【中文标题】具有权重或偏差的随机布尔值【英文标题】:Random boolean with weight or bias 【发布时间】:2013-06-25 22:32:41 【问题描述】:

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

【问题讨论】:

您在寻找什么样的“更好”?这对我来说看起来很合理...... 这是两个(本质上)独立的问题,所以应该在两个不同的帖子中提出...... @JonSkeet 我想我希望得到一些类似于 Random.nextBoolean(长概率)的东西 我已经剪掉了你的第二个问题,如果你想得到答案,请单独发布。我也投票结束了这个问题,因为它主要是基于意见的。 谢谢。我将编辑问题,以减少基于意见的问题。 【参考方案1】:

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

你使用的方法已经很好了。

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


* 用于非加密目的。

【讨论】:

@Baadshah:嗯,是的。我现在改写了!【参考方案2】:

1) 是的,我认为您的方法是有效的,我没有看到其他更简单的方法。

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

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

【讨论】:

【参考方案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;

【讨论】:

三元运算符是完全多余的。为什么不只是boolean true20 = (random.nextInt(5) == 0) 你知道当你学习一个新东西时,它在任何情况下都有用吗?我完全同意这是多余的。【参考方案4】:
    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;
      
      elsereturn true;
      

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

【讨论】:

【参考方案5】:

MockNeat 库实现了此功能。

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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;
    

【讨论】:

【参考方案8】:

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

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;

【讨论】:

验证是合理的,其余的使代码不必要的可读性降低。保持简单

以上是关于具有权重或偏差的随机布尔值的主要内容,如果未能解决你的问题,请参考以下文章

生成随机布尔值的最快方法

在python中获取随机布尔值?

如何检查具有布尔值的复选框

贝叶斯网络中的变量必须是布尔值吗?

生成随机布尔概率

在性能方面,生成随机布尔值的最佳方法是啥?