C# 在内部使用double生成随机整数

C# 在内部使用double生成随机整数,c#,random,C#,Random,我发布了一系列开源随机数生成器,包括一个正态分布随机数生成器。要生成10-20范围内的随机整数,我将编写类似于newNormalRandomGenerator(10,20).Next()的代码 有人发表了这样的评论: 只是想知道是否有必要在中实现“int Next()” “double NextDouble()”的术语,如int到double的转换(和 visa versa)在某些硬件上可能非常慢,包括最近的PC 硬件,虽然我不是最新的CPU 现在 我相信这句话是指当有人在我的一个类内部调用Ne

我发布了一系列开源随机数生成器,包括一个正态分布随机数生成器。要生成10-20范围内的随机整数,我将编写类似于
newNormalRandomGenerator(10,20).Next()的代码

有人发表了这样的评论:

只是想知道是否有必要在中实现“int Next()” “double NextDouble()”的术语,如int到double的转换(和 visa versa)在某些硬件上可能非常慢,包括最近的PC 硬件,虽然我不是最新的CPU 现在

我相信这句话是指当有人在我的一个类内部调用
Next(20)
时,该调用会转换为类似
(int)someMersenneTwister.NextDouble()*20
(我不记得是否使用了舍入)

我这样实现它是因为MT既快速又高效(尽管它有一个巨大的随机周期)。据我所知,这是生成随机数的标准方法——调用
Next()
,它返回[0..1]范围内的一个double,然后乘法并键入int

就我的设计而言,这里有什么问题吗?有没有更好的方法(性能更高、速度更快)来生成不使用双精度的整数随机数


抱歉,这听起来很模糊。我不确定这里是否有问题。

您可以使用“Random.Next Method”:

您将获得一个非负随机数,该随机数小于您提供的指定最大值,或给出一个数字范围(最小值和最大值)


尊敬。

这不是对您问题的回答(因为它在IMO当前的形式中没有意义)。但是查看您的代码,我发现了一些错误和其他问题:

  • 种子设定。随着时间进行种子设定,在几毫秒内创建多个
    UniformRandomGenerator
    s时,会导致种子冲突。您从
    System.Random
    继承该问题
  • MersenneTwister.NextDouble
    的质量很低。
    double
    大约有53位,你只填32位。几乎和
    System.Random
    一样糟糕,后者填31位
  • MersenneTwister.Next(int maxValue)
    现在将坏的双精度拉伸到所需的时间间隔上。如果时间间隔过长,这可能会导致严重的偏差。
    System.Random
    也有类似的问题
  • Next(int-minValue,int-maxValue)
    在计算
    maxValue-minValue
  • NormalRandomGenerator
    的构造函数将平均值计算为
    this.mean=((max-min)/2)+min;
    。这是一个整数除法,如果
    max-min
    是奇数,则会导致偏差。奇怪的选择,因为
    this.mean
    是双精度
  • 计算正态分布数字的代码看起来也很奇怪,但是我不能帮你,因为我不知道它应该做什么


  • 如果你想生成统一的随机整数,这是我自己问题的重复:,该问题的重点是在不引入偏差的情况下高效地创建这些整数。我建议将我的答案与LukeH的答案结合起来。

    通过在范围内缩放两倍来生成随机整数[0..1)是可以的,前提是生成的double分布足够均匀。但是,大多数伪随机数生成器(包括Mersenne Twister)都是以本机方式生成(32位无符号)整数的,因此如果我们不需要进行到double的往返就好了

    如果界N是2的幂,我们可以首先生成一个32位随机整数X并取X mod N。这可以保证生成一个均匀分布的结果。但是如果N不是2的幂,则取模会在结果分布中产生偏差(例如,有更多的32位无符号整数X mod 7是0,而不是6)如果N很小,检测这种偏差将需要大量生成的数字,但理论上,分布将不正确

    为了在[0..N]范围内生成非二次幂的N的真正均匀分布的整数,我们可以采用一种采样算法:首先计算M,使其为大于N的2的最小幂(对于N=13,M=16等等)。然后生成一个32位整数X,计算Y=X mod M。现在,如果Y=N,丢弃它并生成另一个,直到Y 哪种方法最快?只有评测才能告诉我们。这取决于硬件、语言和代码质量


    在Knuth的TAOCP第2部分中可以找到更深入的讨论。

    我甚至不理解有限范围内的整数如何具有正态/高斯分布。这种分布返回整个实轴的连续值。总是可以掩盖较小数字的位,我想这会更快。除此之外,我什么都没有。对于unif在给定的间隔检查中对整数进行orm运算,返回的数字质量很低。它可能使用了
    NextDouble*max
    算法。至少这可以解释它的偏差。很好的答案将所有问题放在了一起!非常好的代码复查,谢谢。但正如你所说,这不是我问题的答案。@ashes999,如果你指定了你想要的内容实际上需要,我们可以回答这个问题。但目前你要求的是一些不可能的/荒谬的东西。@CodeInChaos真的吗?好的,如果你觉得是这样的话,请随意使用DV。@ashes999我更喜欢解释你真正想要的东西。例如,你想要什么分布。某种近似值