我需要生成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的相对素数?
答案 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范围内的值,这取决于更多的位数。