在Mozilla Developer Network页上有一些例子:
/**
* 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()
返回介于0(含)和1(不含)之间的Number
.所以我们有一个这样的间隔:
[0 .................................... 1)
现在,我们想要一个介于min
(含)和max
(不含)之间的数字:
[0 .................................... 1)
[min .................................. max)
我们可以使用Math.random
来获得[min,max]区间内的对应值.但是,首先我们应该通过从第二个区间减go min
来考虑问题:
[0 .................................... 1)
[min - min ............................ max - min)
这使得:
[0 .................................... 1)
[0 .................................... max - min)
我们现在可以应用Math.random
,然后计算相应的.让我们 Select 一个随机数:
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
之间的整数,包括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
结果.