生成随机布尔概率
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) <= 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) < 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;
【讨论】:
通过减少分数,写在代码中的数字突然变成了神奇的数字。除非您可以并且确实确实证明使用更大的数字会显着放缓,否则减少分数的建议会适得其反。此外,您有时使用<
运算符,有时使用==
可能会使初学者感到困惑,一次甚至与零比较,另一次与非零比较。【参考方案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:连续随机变量的指数分布威布尔分布和均匀分布