【发布时间】:2017-01-31 16:54:35
【问题描述】:
我需要在 [A..B] 范围内生成 2 个随机数,并限制数字不能相邻。 我想在恒定时间内完成(我不想一直画到第二个值好)。
我可以想到几种方法来做到这一点:
- 选择第一个,然后选择适合它的后一个:从
[A..B-2]范围内绘制V1,然后从[V1+2..B]范围内绘制V2 - 选择它们之间的距离,然后放置它们:从
[2..B-A]绘制d,从[0..B-A-d]绘制V1,然后V2=V1+d - 选择第一个,然后选择第二个的偏移量:从整个范围绘制 V1,然后从
[A+2-V1..B-V1-1]范围绘制 d,并设置V2= d<=0 ? V1-2+d : V1+1+d - 选择第一个,然后用环绕选择到第二个的距离:从
[A..B]选择V1,从[0..A-B-2]选择d,V2 = V1+d;V2 = V2>B ? V2-(B-A)
我想要最随机的方法(产生最多的熵,分布最均匀)。我认为最后两个是等效的,比前两个更随机。还有更好的方法吗?
【问题讨论】:
-
顺便说一句,重绘没有错 - 这就是当您的范围不是 2 的幂时确保均匀分布的方法。您的随机数函数可能已经在您不知情的情况下执行此操作。
-
您建议的第四种方法似乎是最自然和最容易证明其性质的方法。
-
是否允许
V1 == V2? -
A是否与B相邻?是“循环”范围吗? -
为了便于讨论,A 和 B 至少相距 4 个单位。范围不换行。 V1 不能等于 V2。