如何在 JavaScript 中的两个指定变量之间生成随机整数,例如x = 4并y = 8输出任何一个4, 5, 6, 7, 8?
x = 4
y = 8
4, 5, 6, 7, 8
一些示例:
/** * Returns a random number between min (inclusive) and max (exclusive) */ function getRandomArbitrary(min, max) { return Math.random() * (max - min) + min; } /** * Returns a random integer between min (inclusive) and max (inclusive). * The value is no lower than min (or the next integer greater than min * if min isn't an integer) and no greater than max (or the next integer * lower than max if max isn't an integer). * Using Math.round() will give you a non-uniform distribution! */ 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(不包括)之间的 a。所以我们有一个这样的间隔:
Math.random()
Number
[0 .................................... 1)
现在,我们想要一个介于min(inclusive) 和max(exclusive) 之间的数字:
min
max
[0 .................................... 1) [min .................................. max)
我们可以使用Math.random来获取 [min, max) 区间内的对应方。min但是,首先我们应该通过从第二个区间中减去一点来考虑问题:
Math.random
[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
x = Math.random() * (max - min);
不要忘记加min回来,这样我们就可以在 [min, max) 区间内得到一个数字:
x = Math.random() * (max - min) + min;
这是 MDN 的第一个功能。第二个,返回一个介于min和之间的整数max,包括两者。
现在要获取整数,您可以使用round,ceil或floor.
round
ceil
floor
您可以使用Math.round(Math.random() * (max - min)) + min,但这会产生非均匀分布。两者都有,min并且max只有大约一半的机会滚动:
Math.round(Math.random() * (max - min)) + min
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您一起拥有完美均匀的分布。
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()and -1,因为max现在滚动的机会略少,但您也可以滚动(不需要的)min-1结果。
ceil()
-1
min-1