在给定范围内生成均匀随机偏差

时间:2009-01-15 09:32:56

标签: language-agnostic random

我想在给定范围内生成均匀分布的随机整数。我正在使用的解释语言有一个内置的快速随机数生成器,它返回0(含)到1(含)范围内的浮点数。不幸的是,这意味着我不能使用standard solution seen in another SO question(当RNG返回0(含)到1(不包括)之间的数字时),以便在给定范围内生成均匀分布的随机整数:

result=Int((highest - lowest + 1) * RNG() + lowest)

目前唯一可见的方法是,在极少数情况下,随机数生成器返回1只是要求一个新数字。

但如果有人知道更好的方法,我会很高兴听到它。

罗布

注意:将现有的随机数生成器转换为这种语言会导致一些不可思议的缓慢,所以我担心这不是一个可行的解决方案。

编辑:链接到实际的答案。

2 个答案:

答案 0 :(得分:1)

据推测,你对速度非常感兴趣,否则你只会在每次RNG通话时接受条件测试。无论如何,任何其他替代方案可能会比分支慢......

......除非你确切知道RNG的内部结构是什么。特别是,它的回报值是多少?如果他们不是IEEE-754花车或双打,你会有同情心。如果是,那么它们中有多少实际的随机性?您可以预期24个浮点数和53个双精度数(尾数位数)。如果这些是天真地生成的,你可以使用移位和掩码将一个普通的旧随机整数生成器一起破解,然后在你的函数中使用它(根据你的范围的大小,你可以使用如果你有这样的发电机,更多的换档和面罩,以避免任何分支)。如果你有一个高质量的发生器产生24或53位的全质量随机数,那么只需一次乘法就可以将它们从[0,1]转换为[0,1]:只需乘以最大的可生成浮点数点数小于1,您的范围问题消失了。如果尾数没有完全填充随机位,这个技巧仍然可以工作,但你需要做更多的工作来找到合适的乘数。

您可能需要查看C source to the Mersenne Twister以了解他们对类似问题的处理方法。

答案 1 :(得分:-2)

我不明白为什么需要+ 1。如果随机数发生器在[0,1]区间内提供均匀的值分布,那么......

result = lowest + (rng() * (highest - lowest))

应该为您提供最低

之间的不正确值分布

rng() == 0, result = lowest + 0 = lowest

和最高

rng() == 1, result = lowest + highest - lowest = highest

包括+ 1意味着生成的数字的上限可以高于最高

rng() == 1, result = lowest + highest - lowest + 1 = highest + 1

结果值的分布将与随机数的分布相同,因此均匀性取决于随机数生成器的质量。

从下面的评论开始,你指出Int()将成为尾部偏斜分布的来源是正确的。最好将Round()用于最接近的整数或者脚本语言中的等价物。