我发布了一堆开源随机数发生器
on my site,包括一个正态分布的随机数发生器.要生成10-20范围内的随机整数,我会写一些类似于新的NormalRandomGenerator(10,20).Next().
有人发表了这个评论:
Just wondering whether it’s necessary to implement “int Next()” in
terms of “double NextDouble()”, as int to double conversions (and
visa-versa) can be very slow on some hardware, including recent PC
hardware, although I’m not particularly up to date on the latest CPUs
at the moment.
我相信这个评论指的是当有人在我的一个类上调用Next(20)时,在内部,该调用转换为类似(int)someMersenneTwister.NextDouble()* 20(我不记得我是否使用了舍入).
我这样实现它是因为MT既快速又高效(虽然它有一个巨大的随机期).根据我的理解,这是生成随机数的标准方法 – 调用Next(),它返回范围[0..1]中的double,然后乘以和类型转换为int.
这个设计方面有问题吗?是否有更好的方法(更高性能,更快)生成不使用双精度的整数随机数?
对不起,如果这听起来很模糊.我不确定这里是否有问题.
最佳答案 不是你的问题的答案(因为它目前的形式IMO没有意义).但是查看代码我发现了许多错误和其他问题:
>播种.随着时间的推移,你会在几毫秒内创建多个UniformRandomGenerators时导致种子冲突.您从System.Random继承该问题.
> MersenneTwister.NextDouble是低质量的. double有大约53个数字,你只填满32.几乎与System.Random一样糟糕,填充31.
> MersenneTwister.Next(int maxValue)现在在所需的时间间隔内延伸那个坏的双倍.如果间隔时间长,这可能会导致强烈的偏差. System.Random有一个非常类似的问题.
> next(int minValue,int maxValue)在计算maxValue-minValue时包含int溢出
> NormalRandomGenerator的构造函数计算平均值为this.Mean =((max – min)/ 2)min;.这是整数除法,因此如果max-min是奇数则导致偏差.奇怪的选择,因为这个.Mean是双重的.
>计算正态分布数字的代码看起来也很奇怪,但我无法帮助你,因为我不知道它应该做什么.
如果你想生成统一的随机整数,那就是我自己的问题的重复:Generating uniform random integers with a certain maximum,它专注于有效地创建这些整数而不引入偏差.我建议将我的答案与LukeH的答案结合起来.