一些示例:
function getRandomArbitrary(min, max) { return Math.random() * (max - min) + min;}function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min;}这是背后的逻辑。这是三个简单的规则:
Math.random()返回
Number介于0(含)和1(不含)之间的。所以我们有一个这样的间隔:
[0 .................................... 1)
现在,我们想要一个介于
min(含)和
max(不含)之间的数字:
[0 .................................... 1)[min .................................. max)
我们可以使用
Math.random来获取[min,max)间隔中的对应对象。但是,首先我们应该通过
min从第二个间隔中减去一点来解决这个问题:
[0 .................................... 1)[min - min ............................ max - min)
这给出:
[0 .................................... 1)[0 .................................... max - min)
我们现在可以申请
Math.random,然后计算对应的对象。让我们选择一个随机数:
Math.random() |[0 .................................... 1)[0 .................................... max - min) | x (what we need)
因此,为了找到
x,我们将执行以下操作:
x = Math.random() * (max - min);
不要忘记加
min回去,这样我们就可以在[min,max)间隔中得到一个数字:
x = Math.random() * (max - min) + min;
这是MDN的第一个功能。第二个返回一个介于
min和之间的整数
max,包括两者。
现在,用于获取整数,您可以使用
round,
ceil或
floor。
您可以使用
Math.round(Math.random() * (max - min)) +min,但这会导致分布不均。这两种,
min而
max只有大约一半的机会卷:
min...min+0.5...min+1...min+1.5 ... max-0.5....max└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘ ← Math.round() min min+1 max
与
max从区间中排除,它有一个甚至更少的机会比辊
min。
与
Math.floor(Math.random() * (max - min +1)) + min您有一个完美均匀的分布。
min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)| | | | | |└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘ ← Math.floor() min min+1 max-1 max
您不能在该方程式中使用
ceil()和
-1,因为
max现在滚动的机会要少一些,但是您也可以滚动(不需要的)
min-1结果。



