随机生成的机会非常低

Seb*_*ebb 9 c# random

我正试图在C#中为一个科学项目获得一个随机的bool.问题是布尔值为真的几率必须在10 ^ -12到10 ^ -14之间; 默认随机函数只生成整数,0和[u]之间的值int.max远小.

如何生成一个具有如此低真实概率的随机布尔值?

Rik*_*Rik 15

编辑

Random.NextDouble()不会给出预期的结果!

正如Kyle在下面的评论中建议的那样,将Random.NextDouble()映射的实现一个int区间[0.0,1.0],有效地使我的代码等效于r.Next( 0, Int32.MaxValue ) == 0.添加更多的零不会影响结果为false的概率.

使用其他答案之一,或使用此代码生成ulong(范围0-18446744073709551615)System.Random.

var r = new Random();
var bytes = new byte[8];
r.NextBytes(bytes);
ulong result = BitConverter.ToUInt64(bytes, 0);
Run Code Online (Sandbox Code Playgroud)

原始答案

警告:不会按预期工作,不要使用!仅为上下文提供.


Random.NextDouble()改为使用:结果是介于0.0和1.0之间的双精度

var r = new Random();
var probablyFalseBool = r.NextDouble() < 0.0000000000001;
Run Code Online (Sandbox Code Playgroud)

如有必要,可以改变零的数量.

  • 我不认为这会如你所愿.基于.NET 4.5中System.Random的[源代码](http://referencesource.microsoft.com/#mscorlib/system/random.cs#bb77e610694e64ca),这里给出的代码将导致与` var mightFalseBool = r.Next(0,Int32.MaxValue)== 0`,因为`Random.Next`调用`Random.NextDouble`调用的受保护`Sample`方法. (4认同)

Ant*_*nin 15

尝试组合多个随机选择:

if(rnd.Next(0,10000) == 0 && rnd.Next(0,10000) == 0 && rnd.Next(0,10000) == 0){
}
Run Code Online (Sandbox Code Playgroud)

不确定C#语法是否正确,但是输入if块的概率为10 ^ -12.