有人发表了这个评论:
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的答案结合起来.
总结以上是内存溢出为你收集整理的c# – 在内部使用双打来生成随机整数全部内容,希望文章能够帮你解决c# – 在内部使用双打来生成随机整数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)