javascript从多个范围获取随机数

时间:2017-08-15 10:51:18

标签: javascript math

我见过不同语言的不同实现,但是我还没有遇到过js方法。

基本上,我希望能够在提供的范围数组中检索随机值:var ranges = [{min:2,max:50},{min:500,max:600}, etc...];

我有基本的最大最大功能,只是不确定如何有效地执行此操作:

function getRandomNumber(min,max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

3 个答案:

答案 0 :(得分:0)

这很简单,你只需要一个for循环来迭代数组的所有最小值和最大值,并使用你提供的函数得到结果:

arrRange = [
    [15, 32],
    [9, 43],
    [8, 15]
]

function getRandomNumber(min,max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

for(i = 0; i < arrRange.length; i++) {
    min = arrRange[i][0];
    max = arrRange[i][1];
    randomNumber = getRandomNumber(min, max);
    console.log("A random number between " + min + " and " + max + " is " + randomNumber);
}

结果:

A random number between 15 and 32 is 28
A random number between 9 and 43 is 17
A random number between 8 and 15 is 15

答案 1 :(得分:0)

您可以使用forEach方法。 forEach()方法按顺序为数组中的每个元素调用一次提供的函数。 在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

了解有关forEach的更多信息

var ranges = [{
  min: 2,
  max: 50
}, {
  min: 500,
  max: 600
}];

ranges.forEach(function(e) {
  console.log(Math.floor((Math.random() * (e.max - e.min + 1)) + e.min));
})

答案 2 :(得分:0)

此方法的工作方式是每个范围代表所有范围内所有可能值总和的一小部分。如果n是所有可能值的总数,您可以想象分布范围中的值如下:

1------10|11-----14|15---------------40|41-----49|....|(n-x)-----n
 range 1 | range 2 |       range 3     | range 4 |....|  range n

1-10对应于范围1中的值,依此类推。

从那里开始,只需要生成一个从1n的随机数,确定它属于哪个范围,以及它对应的范围内的哪个值。

让范围表示为元组数组,如

ranges = [(2, 50), (500, 600), (630, 890)]

假设范围是排序的并且彼此不重叠,首先我们必须找到跨越这些范围的整数总数,即我们可以生成的可能值的总数(n)。我们将这些范围的长度存储在数组lengths中。伪代码:

lengths = ranges.map(range => range.max - range.min + 1)

请注意,上面指定的地图功能仅适用于包含范围。根据范围的类型,您可能需要更改它。另请注意n = sum(lengths)

x1n(包括)范围内的随机数。然后,找到i整数的范围的数组索引x如下:

i = 0
while (x > lengths[i]) {
    x -= lengths[i]
    i++
}

在此循环之后,x将包含范围i中随机数的索引。也就是说,如果x为3,则随机数是范围i中的第三个数字。

然后ranges[i].min + (x - 1)给出了所需的随机数。