2017-08-15 108 views
0

我见过不同的实现不同的语言,但我还没有遇到一个JS方法。JavaScript从多个范围获取随机数

从本质上讲,我希望能够到的范围的提供的数组中获取一个随机值:var ranges = [{min:2,max:50},{min:500,max:600}, etc...];

我有基本的最小最大功能,只是不知道如何有效地做到这一点:

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

你看这个https://stackoverflow.com/a/1527820/6448640 –

+0

你只是问如何遍历数组并调用循环内的函数...? – CBroe

+0

对不起,也许我的问题还不够清楚。我想要一个满足所有范围的单个返回数字;不是每个范围的随机数。 – Adam

回答

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 
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(含)之间的随机数。然后在其中x个整数被发现的范围内的数组索引i被给定为:

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

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

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