均匀分布的随机数相对于2的素数

时间:2009-06-29 23:13:55

标签: language-agnostic discrete-mathematics random

一个具体的例子

我需要生成0到2之间的随机数,包括0和2。 (或在-1,0和1之间随机选择)。

天真的方法是做rand() mod 3之类的事情,其中​​rand()返回一个整数。除非rand()的上限不是相对素数(并且下限为0),否则此方法不会生成统计随机数。

例如,假设rand()返回2位(从0到3,包括0和3),模数将映射:

0 - > 0
1 - > 1
2 - > 2
3 - > 0

如果返回更多的位,这种向0的偏差显然会小得多,但不管怎样,偏差都会保留。

通用问题

有没有办法在0到n-1之间生成均匀分布的随机数,其中n是2的相对素数?

4 个答案:

答案 0 :(得分:3)

一种常见的方法是丢弃上一个完整周期之上的随机值,只需要一个新的随机数。

答案 1 :(得分:2)

这可能有助于选择你的rand()上限为k * n,其中k是一个整数。这样,只要rand()是一个好的随机生成器,结果就会均匀分布。

如果无法减小上限,则可以选择k,使k * n尽可能接近rand()上限,并再次尝试高于此数字的结果。

答案 2 :(得分:1)

请参阅my answer类似的问题。

基本上,使用您的RNG并丢弃N以上的所有内容,然后重试。为了优化,您可以使用mod,并丢弃n * floor(MAX / n)以上的所有内容

答案 3 :(得分:0)

通用答案:您需要使用多于2位的数字。

我的经验法则是生成浮点值, x ,0.0< = x < 1.0,乘以3并截断。这应该得到0,1和2范围内的值,这取决于更多的位数。