【发布时间】:2012-03-24 17:22:55
【问题描述】:
我发布了一堆开源随机数生成器on my site,包括一个正态分布的随机数生成器。要生成 10-20 范围内的随机整数,我会写类似 new NormalRandomGenerator(10, 20).Next() 的内容。
有人发表了这条评论:
只是想知道是否有必要在中实现“int Next()” “double NextDouble()”的术语,作为 int 到 double 转换(和 反之亦然)在某些硬件上可能非常慢,包括最近的 PC 硬件,虽然我不是特别了解最新的 CPU 目前。
我相信这条评论指的是当有人在我的一个班级上调用 Next(20) 时,在内部,该调用会转换为 (int)someMersenneTwister.NextDouble() * 20 之类的东西(我不记得我是否使用了四舍五入)。
我以这种方式实现它是因为 MT 既快速又高效(尽管它有一个巨大的随机周期)。据我了解,这是生成随机数的标准方法——调用Next(),它返回 [0 .. 1) 范围内的双精度数,然后相乘并转换为 int。
我的设计有什么问题吗?有没有更好的方法(性能更高、速度更快)来生成不使用双精度数的整数随机数?
对不起,如果这听起来含糊不清。我不确定这里是否有问题。
【问题讨论】:
-
我什至不明白有限范围内的整数如何具有正态/高斯分布。此分布在整个实轴上返回连续值。
-
总是可以屏蔽较小数字的位,我想这会更快。除此之外,我一无所获。
-
对于给定间隔中的 uniform 整数,请检查 my question 和 my random library