given a Math.random()
返回 [0,1) 之间的数字的函数min
max
值来指定范围,我们如何为以下情况生成数字:
我们想要的案例integer:
A: (min,max) ?
B: [min,max) return Math.floor(Math.random() * (max - min)) + min;
C: (min,max] ?
D: [min,max] return Math.floor(Math.random() * (max - min + 1)) + min;
我们想要的案例float:
A: (min,max) ?
B: [min,max) return Math.random() * (max - min) + min;
C: (min,max] ?
D: [min,max] ?
Integers你的 B. 公式是正确的,其他一切都是通过微不足道获得的+1
-1
更正:
- A.
(min, max) = [min + 1, max)
,因此从 B. 我们得到min + 1 + Math.floor(Math.random() * (max - min - 1))
- B.
min + Math.floor(Math.random() * (max - min))
- C. 由于在区间算术中
(min, max] = max - [0, max - min)
,也可以写max - Math.floor(Math.random() * (max - min))
- D.
[min, max] = [min, max + 1)
, 所以:min + Math.floor(Math.random() * (max + 1 - min))
Floats.正如 V13 已经指出的那样,这个问题有点不恰当:如果我们将单个点视为零测度集,则四个集合之间几乎(在测度理论意义上)没有差异......但是,如果你想保证排除的区间边界永远不会(不仅仅是“几乎永远不会”)被采样,如果你假设没有舍入错误,你可以这样做:
A: var middle = (min + max) / 2; var sign = Math.random() > 0.5 ? 1 : -1; return middle + sign * (max - min) / 2 * Math.random();
这个解决方案增加了一点点质量0
,但这对于所有实际目的来说应该可以忽略不计。
B: min + Math.random() * (max - min)
, yes.
- C:
max - Math.random() * (max - min)
,与上式对称。
- D:不可能保证我们曾经达到区间上限,所以我们可以使用
min + Math.random() * (max - min)
.
A 和 D 之间的区别如下:如果我们尝试使用公式min + Math.random() * (max - min)
在 A 中,我们偶尔可能会得到0
(因为可能的数字范围实际上是有限的)。然而,没有任何合理的统计数据可以抱怨 D 没有达到上限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)