3

一个具体的例子

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

天真的方法是执行类似rand() mod 3whererand()返回整数的操作。这种方法不会生成统计上的随机数,除非 的上界rand()不是互质的(下界为 0)。

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

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

如果返回更多位,则这种向 0 的偏斜显然会小得多,但无论如何,偏斜将保持不变。

一般问题

有没有办法在 0 和 n-1 之间生成一个均匀分布的随机数,其中 n 与 2 互质?

4

4 回答 4

3

一种常见的方法是丢弃最后一个完整周期以上的随机值,并只要求一个新的随机数。

于 2009-06-29T23:18:35.040 回答
2

将 rand() 上限选择为 k*n 可能会有所帮助,其中 k 是整数。如果 rand() 是一个好的随机生成器,那么结果将均匀分布。

如果无法降低上限,您可以选择 k 以使 k*n 尽可能接近 rand() 上限,然后再次尝试丢弃高于此数字的结果。

于 2009-06-29T23:28:36.500 回答
1

请参阅对类似问题的回答。

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

于 2009-06-29T23:26:24.587 回答
0

通用答案:您需要使用的不仅仅是 2 位数字。

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

于 2009-06-29T23:25:52.200 回答