在特定范围内的 JavaScript 中生成随机整数?
如何在 JavaScript 中的两个指定变量之间生成随机整数,例如x = 4
和 y = 8
会输出任何 4, 5, 6, 7, 8
?
How can I generate random whole numbers between two specified variables in JavaScript, e.g. x = 4
and y = 8
would output any of 4, 5, 6, 7, 8
?
推荐答案
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;
}
<小时>
这是它背后的逻辑.这是一个简单的三法则:
Here's the logic behind it. It's a simple rule of three:
Math.random()
返回一个介于 0(包括)和 1(不包括)之间的 Number
.所以我们有一个这样的区间:
Math.random()
returns a Number
between 0 (inclusive) and 1 (exclusive). So we have an interval like this:
[0 .................................... 1)
现在,我们想要一个介于 min
(包括)和 max
(不包括)之间的数字:
Now, we'd like a number between min
(inclusive) and max
(exclusive):
[0 .................................... 1)
[min .................................. max)
我们可以使用 Math.random
来获取 [min, max) 区间内的对应者.但是,首先我们应该通过从第二个间隔中减去 min
来考虑问题:
We can use the Math.random
to get the correspondent in the [min, max) interval. But, first we should factor a little bit the problem by subtracting min
from the second interval:
[0 .................................... 1)
[min - min ............................ max - min)
这给出了:
[0 .................................... 1)
[0 .................................... max - min)
我们现在可以应用 Math.random
然后计算对应值.让我们选择一个随机数:
We may now apply Math.random
and then calculate the correspondent. Let's choose a random number:
Math.random()
|
[0 .................................... 1)
[0 .................................... max - min)
|
x (what we need)
所以,为了找到 x
,我们会这样做:
So, in order to find x
, we would do:
x = Math.random() * (max - min);
别忘了把min
加回来,这样我们就可以得到一个在[min, max)区间内的数字:
Don't forget to add min
back, so that we get a number in the [min, max) interval:
x = Math.random() * (max - min) + min;
这是 MDN 的第一个功能.第二个,返回 min
和 max
之间的整数,两者都包含.
That was the first function from MDN. The second one, returns an integer between min
and max
, both inclusive.
现在要获取整数,您可以使用 round
、ceil
或 floor
.
Now for getting integers, you could use round
, ceil
or floor
.
您可以使用 Math.round(Math.random() * (max - min)) + min
,但这会产生非均匀分布.min
和 max
都只有大约一半的滚动机会:
You could use Math.round(Math.random() * (max - min)) + min
, this however gives a non-even distribution. Both, min
and max
only have approximately half the chance to roll:
min...min+0.5...min+1...min+1.5 ... max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘ ← Math.round()
min min+1 max
将max
排除在区间之外,滚动的机会比min
还要小.
With max
excluded from the interval, it has an even less chance to roll than min
.
使用 Math.floor(Math.random() * (max - min +1)) + min
你有一个完全均匀的分布.
With Math.floor(Math.random() * (max - min +1)) + min
you have a perfectly even distribution.
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
结果.
You can't use ceil()
and -1
in that equation because max
now had a slightly less chance to roll, but you can roll the (unwanted) min-1
result too.
相关文章