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

C# 生成随机布尔值的最快方法,c#,performance,random,boolean,C#,Performance,Random,Boolean,因此,有几种方法可以在C#中创建随机布尔值: 使用Random.Next():rand.Next(2)=0 使用Random.NextDouble():rand.NextDouble()>0.5 真的有区别吗?如果是的话,哪一个性能更好?或者还有其他我没有看到的方法,可能更快吗?第一个选项-rand。接下来(2)在幕后执行以下代码: if (maxValue < 0) { throw new ArgumentOutOfRangeException("maxValue",

因此,有几种方法可以在C#中创建随机布尔值:

  • 使用Random.Next():
    rand.Next(2)=0
  • 使用Random.NextDouble():
    rand.NextDouble()>0.5

真的有区别吗?如果是的话,哪一个性能更好?或者还有其他我没有看到的方法,可能更快吗?

第一个选项-
rand。接下来(2)
在幕后执行以下代码:

if (maxValue < 0)
{
    throw new ArgumentOutOfRangeException("maxValue",
        Environment.GetResourceString("ArgumentOutOfRange_MustBePositive", new object[] { "maxValue" }));
}
return (int) (this.Sample() * maxValue);

由于第一个选项包含
maxValue
验证、乘法和强制转换,第二个选项的速度可能更快

返回

大于或等于0.0且小于1.0的双精度浮点数

因此,如果你想要一个均匀分布的随机布尔值,你应该使用
=0.5

rand.NextDouble() >= 0.5
范围1:[0.0…0.5[
范围2:[0.5…1.0[
|范围1 |=|范围2 |


我用秒表进行了测试。100000次迭代:

System.Random rnd = new System.Random();
if (rnd.Next(2) == 0)
     trues++;
CPU喜欢整数,所以下一个(2)方法更快。3700比7500ms,这是相当可观的。 另外:我认为随机数可能是一个瓶颈,我在Unity中创建了大约50帧,即使有一个很小的场景明显减慢了我的系统,所以我也希望找到一种创建随机布尔的方法。 所以我也试过了

if (System.DateTime.Now.Millisecond % 2 == 0)
       trues++;
但是在9600毫秒的时间里,调用静态函数的速度更慢。值得一试。
最后,我跳过了比较,只创建了100000个随机值,以确保int和double比较不会影响经过的时间,但结果基本相同。

最快。调用该方法的开销较小。下面的扩展方法比
random.NextDouble()快20%>0.5
,比
随机快35%。下一步(2)==0

public static bool NextBoolean(this Random random)
{
    return random.Next() > (Int32.MaxValue / 2);
    // Next() returns an int in the range [0..Int32.MaxValue]
}
比最快的更快。通过使用技巧,可以使用
random
类更快地生成随机布尔值。生成的
int
的31个有效位可用于31个后续布尔值生成。下面的实现比之前声明的最快布尔值生成快40%

public class RandomEx : Random
{
    private uint _boolBits;

    public RandomEx() : base() { }
    public RandomEx(int seed) : base(seed) { }

    public bool NextBoolean()
    {
        _boolBits >>= 1;
        if (_boolBits <= 1) _boolBits = (uint)~this.Next();
        return (_boolBits & 1) == 0;
    }
}
公共类RandomEx:Random
{
私人单位布尔比特;
public RandomEx():base(){}
公共随机数(整数种子):基(种子){}
公共bool NextBoolean()
{
_胸部>>=1;

如果(\u boolBits)这真的是瓶颈吗?没有实际运行它(因为任何方法都会非常快),我的猜测是使用
NextBytes
预填充字节数组,使用
BitArray
将其转换为布尔值集合,然后从
队列中检索这些布尔值,直到其清空,然后重复此过程。使用此方法,您只需使用随机化器一次,因此它产生的任何开销只会在n重新填充队列。这在处理安全的随机数生成器而不是常规的
random
类时可能很有用。@JoeEnos MS将
NextBytes
的实现搞砸了,所以它令人惊讶slow@CodesInChaos哇,这很有趣-我只是在反汇编程序中查找它,看看你指的是什么o:
buffer[i]=(字节)(this.InternalSample()%256)
-我假设这就是你所说的,他们可以把那个随机整数拆分成3个字节,用大约1/3的工作量填充字节数组。我想知道这是否有原因,或者这只是开发人员的疏忽。谢谢,这就是我想知道的。我自己的计时说第二个选项ion比first.DateTime快5%左右。Now是出了名的慢。理想情况下,应该使用依赖硬件的解决方案或至少依赖操作系统的解决方案来加快速度。使用,它比
DateTime快得多。Now
。谢谢!对于那些使用UnityEngine编写脚本的人,请确保使用System.Random而不是UnityEngine.Random,因为它们不是这不是一回事!
public static bool NextBoolean(this Random random)
{
    return random.Next() > (Int32.MaxValue / 2);
    // Next() returns an int in the range [0..Int32.MaxValue]
}
public class RandomEx : Random
{
    private uint _boolBits;

    public RandomEx() : base() { }
    public RandomEx(int seed) : base(seed) { }

    public bool NextBoolean()
    {
        _boolBits >>= 1;
        if (_boolBits <= 1) _boolBits = (uint)~this.Next();
        return (_boolBits & 1) == 0;
    }
}