首页 > 解决方案 > 随机数生成器不会使用输入字段中的值生成给定范围内的预期数字

问题描述

我正在尝试在两个给定值之间生成一个随机数。我可以用一个非常标准的小函数来生成它,但是当我尝试通过输入字段设置最大值和最小值时,我得到了一些意想不到的结果。

这是使用 jQuery,这对于此特定功能不是必需的,但对于较大的项目是必需的。

这是我发现的一个例子:

https://jsfiddle.net/u2k41hzd/

function randomNumber(min, max) {
    points = Math.floor(Math.random() * (max - min + 1) + min);
}

$( "button" ).on( "click", function ( event ) {
    minPoints = $( ".min-points" ).val();
    maxPoints = $( ".max-points" ).val();
    randomNumber(minPoints, maxPoints);
    $(".random").html(points);
});

在最小数字为 1 和最大数字为 6 的情况下,我希望得到介于 1 和 6 之间的数字。但是,我得到介于 0 和 5 之间的数字。

如果最小数字是 2,最大数字是 6,我希望得到 2 到 6 之间的数字,但得到 0 到 4 之间的数字。传入 3 和 6 会得到 0 到 3 之间的数字,依此类推。

忽略输入值并对其进行硬编码似乎可以毫无问题地产生预期结果。本质上,我只是不确定为什么输入值的行为如此。我确定我只是误解了某些东西或在某处犯了错误,但我无法确定原因!

标签: javascriptjqueryformsrandom

解决方案


问题是您需要添加min到四舍五入的数字,而不是随机生成的数字:

function randomNumber(min, max) {
    points = Math.floor(Math.random() * (max - min + 1)) + min;
}

为了进一步解释,对于 2 和 9 的情况:

  1. Math.random() 生成一个介于 0 和 0.999999999 之间的数字...
  2. 最大值 - 最小值 + 1 = 8
  3. 所以生成的数字将在 8 * 0 和 8 * 0.99999999 范围内...
  4. 地板将在 [0, 7] 范围内向下舍入
  5. 结果需要被起始数字偏移(即最小允许数字 - 2)

推荐阅读