如何在 JavaScript 中的两个指定变量之间生成随机整数,例如x = 4
并y = 8
输出任何一个4, 5, 6, 7, 8
?
在 JavaScript 中生成特定范围内的随机整数?
Mozilla 开发者网络页面上有一些示例:
/**
* 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(不含)之间的值。所以我们有一个这样的区间:
[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()
and -1
,因为max
现在滚动的机会略少,但您也可以滚动(不需要的)min-1
结果。
var randomnumber = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
Math.random()
返回一个介于 min(包括)和 max(包括)之间的整数随机数:
function randomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
或min(包括)和 max(不包括)之间的任何随机数:
function randomNumber(min, max) {
return Math.random() * (max - min) + min;
}
有用的例子(整数):
// 0 -> 10
Math.floor(Math.random() * 11);
// 1 -> 10
Math.floor(Math.random() * 10) + 1;
// 5 -> 20
Math.floor(Math.random() * 16) + 5;
// -10 -> (-2)
Math.floor(Math.random() * 9) - 10;
** 总是很高兴被提醒(Mozilla):
Math.random() 不提供加密安全的随机数。不要将它们用于与安全相关的任何事情。改用 Web Crypto API,更准确地说是 window.crypto.getRandomValues() 方法。
function getRandomizer(bottom, top) {
return function() {
return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
}
}
用法:
var rollDie = getRandomizer( 1, 6 );
var results = ""
for ( var i = 0; i<1000; i++ ) {
results += rollDie() + " "; //make a string filled with 1000 random numbers in the range 1-6.
}
分解:
我们正在返回一个函数(从函数式编程中借用),当调用该函数时,将返回值bottom
和之间的随机整数top
,包括。我们说“包含”是因为我们希望在可以返回的数字范围内同时包含底部和顶部。这样,getRandomizer( 1, 6 )
将返回 1、2、3、4、5 或 6。
(底部是较小的数字,顶部是较大的数字)
Math.random() * ( 1 + top - bottom )
Math.random()
返回0和1之间的随机双,如果我们用它乘间一个加的区别top
和bottom
,我们会得到之间的双某处0
和1+b-a
。
Math.floor( Math.random() * ( 1 + top - bottom ) )
Math.floor
将数字向下舍入到最接近的整数。所以我们现在有了0
和之间的所有整数top-bottom
。1 看起来令人困惑,但它需要存在,因为我们总是向下取整,因此如果没有它,实际上永远不会达到最高数字。我们生成需要随机十进制是在范围内0
,以(1+top-bottom)
使我们能够在范围向下取整,并得到一个int0
到top-bottom
Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom
在前面的例子中的代码给了我们一个整数的范围0
和top-bottom
,所以我们现在需要做的就是添加bottom
到该结果得到的整数bottom
和top
包容性。:D
注意:如果你先传入一个非整数值或更大的数字,你会得到不受欢迎的行为,但除非有人提出要求,否则我不会深入研究参数检查代码,因为它与原始问题的意图相去甚远.
返回 1 到 10 之间的随机数:
Math.floor((Math.random()*10) + 1);
返回 1 到 100 之间的随机数:
Math.floor((Math.random()*100) + 1)