tim*_*edt 75 c# random performance boolean
因此,有几种方法可以在C#中创建随机bool:
rand.Next(2) == 0rand.NextDouble() > 0.5真的有区别吗?如果是这样,哪一个实际上有更好的表现?还是有另一种我没看到的方式,可能更快?
Avi*_*hen 64
第一个选项 - rand.Next(2)在幕后执行以下代码:
if (maxValue < 0)
{
throw new ArgumentOutOfRangeException("maxValue",
Environment.GetResourceString("ArgumentOutOfRange_MustBePositive", new object[] { "maxValue" }));
}
return (int) (this.Sample() * maxValue);
Run Code Online (Sandbox Code Playgroud)
而对于第二种选择 - rand.NextDouble():
return this.Sample();
Run Code Online (Sandbox Code Playgroud)
由于第一个选项包含maxValue验证,乘法和转换,因此第二个选项可能更快.
DaR*_*ich 53
第二种选择的小增强:
根据MSDN
public virtual double NextDouble()
Run Code Online (Sandbox Code Playgroud)
回报
双精度浮点数大于或等于0.0且小于1.0.
所以如果你想要一个均匀分布的随机bool你应该使用 >= 0.5
rand.NextDouble() >= 0.5
Run Code Online (Sandbox Code Playgroud)
范围1:[0.0 ... 0.5 [
范围2:[0.5 ... 1.0 [
|范围1 | = |范围2 |
The*_*ias 14
最快的。调用该方法Random.Next的开销较小。下面的扩展方法运行速度比 快 20%,比Random.NextDouble() > 0.5快 35% Random.Next(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]
}
Run Code Online (Sandbox Code Playgroud)
比最快的还快。Random通过使用技巧,可以更快地使用该类生成随机布尔值。生成的 31 个有效位int可用于 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我用秒表进行了测试。100,000次迭代:
System.Random rnd = new System.Random();
if (rnd.Next(2) == 0)
trues++;
Run Code Online (Sandbox Code Playgroud)
CPU喜欢整数,因此Next(2)方法更快。3,700对7,500ms,这是相当可观的。另外:我认为随机数可能会成为瓶颈,即使在一个很小的场景中,我在Unity中每帧创建了大约50个帧,这明显降低了我的系统的速度,所以我也希望找到一种创建随机布尔值的方法。所以我也试过了
if (System.DateTime.Now.Millisecond % 2 == 0)
trues++;
Run Code Online (Sandbox Code Playgroud)
但是调用静态函数的速度甚至比9600ms还要慢。值得一试。最后,我跳过了比较,仅创建了100,000个随机值,以确保int vs. double比较不会影响经过的时间,但结果几乎相同。