因此,有几种方法可以在C#中创建随机bool:
rand.Next(2) == 0
rand.NextDouble() > 0.5
真的有区别吗?如果是这样,哪一个实际上有更好的表现?还是有另一种我没看到的方式,可能更快?
答案 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;
}
}