生成随机布尔概率

Posted

技术标签:

【中文标题】生成随机布尔概率【英文标题】:Generate Random Boolean Probability 【发布时间】:2014-10-06 04:56:00 【问题描述】:

我只知道如何生成随机布尔值(真/假)。 默认概率为 50:50

但是我怎样才能用我自己的概率生成一个真假值呢? 假设它以 40:60 或 20:80 等的概率返回 true...

【问题讨论】:

生成一个介于 1 到 100 之间的随机数并将其与您的分布进行比较? 到目前为止你做了什么? 【参考方案1】:

嗯,一种方法是Random.Next(100) <= 20 ? true : false,使用 NextInt 的整数值来强制你自己的概率。不过,我不能说这种方法真正的“随机性”。

更详细的例子:

Random gen = new Random();
int prob = gen.Next(100);
return prob <= 20;

【讨论】:

我敢假设这些布尔值的可预测性与Random.Next() 一样随机。我不知道这是否与randomness 相同。 对我来说,在 ASP.Net 中,工作语法变得更加复杂:myRandomBool = new Random().Next(100) &lt;= 50 ? true : false @E. Moffat:? true : false 是冗余代码。【参考方案2】:

您生成一个最多 100 个独占的随机数,并查看它是否小于给定百分比。示例:

if(random.Next(100) < 40) 
  // will be true 40% of the time

更一般地说,对于 X/Y 的概率,请使用如下成语:

if(random.Next(Y) < X)

【讨论】:

【参考方案3】:

这是一个扩展方法,它将提供具有指定概率(以百分比计)为真的随机布尔值;

public static bool NextBool(this Random r, int truePercentage = 50)

    return r.NextDouble() < truePercentage / 100.0;

你可以像这样使用它

Random r = new Random();
r.NextBool(); // returns true or false with equal probability
r.NextBool(20); // 20% chance to be true;
r.NextBool(100); // always return true
r.NextBool(0); // always return false

【讨论】:

【参考方案4】:

假设您的概率表示为介于 0.0 和 1.0 之间的 double,我会更简单地实现它:

Random rand = new Random();
...
double trueProbability = 0.2;
bool result = rand.NextDouble() < trueProbability;

result 将是true,概率由trueProbability 给出

http://msdn.microsoft.com/en-us/library/system.random.nextdouble(v=vs.110).aspx

如果这还不够“随机”,你可以看看RNGCryptoServiceProvider

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx

【讨论】:

要完全代表真实概率,你不应该做一个 @hubsonbropa 不,因为 NextDouble() 返回的值介于 0(包括)和 1(不包括)之间。如果您推断出 100% 的概率,则 @hubsonbropa 另外,0% 永远不应该是真的。解决这种情况的唯一方法是检查 【参考方案5】:

我觉得可以帮到你

Random gen = new Random();
bool result = gen.Next(100) < 50 ? true : false;

【讨论】:

表达式gen.Next(100) &lt; 50 是布尔表达式。此处无需使用条件运算符。【参考方案6】:

为了将来的知识:

40:60 将是:

var random = new Random();
return random.Next(10) < 4;

20:80 将是:

var random = new Random();
return random.Next(5) == 0

1:1 将是:

var random = new Random();
return random.Next(2) == 1;

注意:只需将概率缩短为最短变体 - 例如:“random.Next(5) == 0”比“random.Next(100)

[ModifierByChoice] bool GetProbability(int trueProbability, int falseProbability)

var random = new Random();
return random.Next(trueProbability, trueProbability + falseProbability) < trueProbability;

【讨论】:

通过减少分数,写在代码中的数字突然变成了神奇的数字。除非您可以并且确实确实证明使用更大的数字会显着放缓,否则减少分数的建议会适得其反。此外,您有时使用&lt; 运算符,有时使用== 可能会使初学者感到困惑,一次甚至与零比较,另一次与非零比较。【参考方案7】:
Random gen = new Random();
var boolVal = gen.Next(0, 1)==1? true : false;

【讨论】:

问题是:But how can I generate a true false value with my own probability? Let's say it returns true with a probability of 40:60 or 20:80 etc...。这个答案是错误的。

以上是关于生成随机布尔概率的主要内容,如果未能解决你的问题,请参考以下文章

人工智能数学基础--概率与统计14:连续随机变量的指数分布威布尔分布和均匀分布

人工智能数学基础--概率与统计14:连续随机变量的指数分布威布尔分布和均匀分布

如何根据概率密度函数生成随机数

excel中RAND函数产生随机数的概率控制

java如何实现这样的随机数字呢?

Java改变生成随机数的平均值(改变生成随机数的概率)