这种方法的工作方式是,每个范围表示的总和的所有可能值中的中的所有范围的级分。如果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,依此类推。
从那里生成一个简单的事情,从1
到n
产生一个随机数,找出它属于哪个范围和它对应的范围内的哪个值。
让范围被表示为元组的阵列,如
ranges = [(2, 50), (500, 600), (630, 890)]
假设范围进行排序,并且不彼此重叠,第一,我们必须找到跨越这些范围的整数的总数,即我们可以生成的可能值的总数(n
)。我们将这些范围的长度存储在一个数组lengths
中。伪代码:
lengths = ranges.map(range => range.max - range.min + 1)
请注意,上面指定的映射函数仅适用于包含范围。根据您的范围的类型,您可能需要更改它。另请注意,n = sum(lengths)
。
设x
为1
至n
(含)之间的随机数。然后在其中x
个整数被发现的范围内的数组索引i
被给定为:
i = 0
while (x > lengths[i]) {
x -= lengths[i]
i++
}
该循环后,x
将包含随机数的索引在范围i
。也就是说,如果x
是3,则随机数是范围为i
的第三个数字。
然后由ranges[i].min + (x - 1)
给出所需的随机数。
你看这个https://stackoverflow.com/a/1527820/6448640 –
你只是问如何遍历数组并调用循环内的函数...? – CBroe
对不起,也许我的问题还不够清楚。我想要一个满足所有范围的单个返回数字;不是每个范围的随机数。 – Adam