繁体   English   中英

javascript从多个范围获取随机数

[英]javascript getting random number from multiple ranges

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

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

我有基本的min max函数,只是不确定如何有效地做到这一点:

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

很简单,您只需要一个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

您可以为此使用forEach方法。 forEach()方法为数组中的每个元素依次调用提供的函数。 在以下网址了解有关forEach的更多信息: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/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)); }) 

此方法的工作方式是,每个范围代表所有范围内所有可能值的总和的一小部分。 如果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)

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

x1n (含)范围内的随机数。 然后找到第x个整数的范围的数组索引i给出为:

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

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

然后,所需的随机数由ranges[i].min + (x - 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM