c# – 在内部使用双打来生成随机整数

c# – 在内部使用双打来生成随机整数,第1张

概述我发布了一堆开源随机数发生器 on my site,包括一个正态分布的随机数发生器.要生成10-20范围内的随机整数,我会写一些类似于新的NormalRandomGenerator(10,20).Next(). 有人发表了这个评论: Just wondering whether it’s necessary to implement “int Next()” in terms of “double 我发布了一堆开源随机数发生器 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的答案结合起来.

总结

以上是内存溢出为你收集整理的c# – 在内部使用双打来生成随机整数全部内容,希望文章能够帮你解决c# – 在内部使用双打来生成随机整数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1234433.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存