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

时间:2013-10-04 21:25:50

标签: c# performance random boolean

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

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

真的有区别吗?如果是这样,哪一个实际上有更好的表现?还是有另一种我没看到的方式,可能更快?

4 个答案:

答案 0 :(得分:60)

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

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

以及第二个选项 - rand.NextDouble()

return this.Sample();

由于第一个选项包含maxValue验证,乘法和转换,第二个选项可能更快

答案 1 :(得分:45)

第二个选项的小增强

根据MSDN

public virtual double NextDouble()

返回

  

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

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

rand.NextDouble() >= 0.5
  

范围1:[0.0 ... 0.5 [
  范围2:[0.5 ... 1.0 [
  |范围1 | = |范围2 |

答案 2 :(得分:5)

我用秒表进行了测试。 100,000次迭代:

System.Random rnd = new System.Random();
if (rnd.Next(2) == 0)
     trues++;

CPU就像整数一样,因此Next(2)方法更快。 3,700对7,500ms,这是相当可观的。 另外:我认为随机数可能是一个瓶颈,我在Unity中每帧创建了大约50个,即使有一个很小的场景也明显降低了我的系统的速度,所以我也希望找到一种创建随机布尔值的方法。 所以我也尝试了

if (System.DateTime.Now.Millisecond % 2 == 0)
       trues++;

,但是调用静态函数的速度甚至比9600ms还要慢。值得一试。 最后,我跳过了比较,仅创建了100,000个随机值,以确保int vs. double比较不会影响经过的时间,但结果几乎相同。

答案 3 :(得分:0)

最快。调用方法Random.Next的开销较小。下面的扩展方法比Random.NextDouble() > 0.5运行快20%,比Random.Next(2) == 0运行快35%。

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;
    }
}