如何在JavaScript中的两个指定变量之间生成随机整数,例如x = 4y = 8将输出4, 5, 6, 7, 8中的任意一个?

推荐答案

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的第一个函数.第二个函数返回一个介于minmax之间的整数,包括minmax.

现在要得到整数,可以使用roundceilfloor.

你可以使用Math.round(Math.random() * (max - min)) + min,但是这给出了一个不均匀的分布.minmax都只有大约一半的机会:

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结果.

Javascript相关问答推荐

使用typeof运算符获取对象值类型-接收字符串而不是数组

微软Edge Select 间隙鼠标退出问题

我试图实现用户验证的reduxstore 和操作中出了什么问题?

微软Edge编辑和重新发送未显示""

数字时钟在JavaScript中不动态更新

在react JS中映射数组对象的嵌套数据

加载背景图像时同步旋转不显示的问题

Javascript json定制

如何使用子字符串在数组中搜索重复项

使用POST请求时,Req.Body为空

在forEach循环中获取目标而不是父对象的属性

第二次更新文本输入字段后,Reaction崩溃

如何在Angular拖放组件中同步数组?

为什么这个.add.group({})在教程中运行得很好,但在我的游戏中就不行了?

为什么JPG图像不能在VITE中导入以进行react ?

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

Django导入问题,无法导入我的应用程序,但我已在设置中安装了它

我怎样才能得到一个数组的名字在另一个数组?

谷歌饼图3D切片

当S点击按钮时,我如何才能改变它的样式?