具有权重或偏差的随机布尔值
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;
【讨论】:
验证是合理的,其余的使代码不必要的可读性降低。保持简单以上是关于具有权重或偏差的随机布尔值的主要内容,如果未能解决你的问题,请参考以下文章