你好!
这是一个有趣的问题;当你意识到要实现真正的随机性,选择一个特定范围的概率必须由该范围的长度来衡量时,这个问题就变得有趣了。
等长范围:
如果这三个范围的长度相等,例如范围(0,10)、范围(20,30)和范围(40,50);那么,要选取一个随机数,我们可以执行以下操作:随机选取一个范围。
从该范围中选择一个随机数。
不等长范围:
现在,考虑三个大小不等的范围,比如范围(0,2),范围(4,6)和范围(10100)
第三个范围比前两个大得多。如果我们在处理同样长的区间时采用同样的策略,我们将倾向于从前两个区间中选择数字。
为了从三个不等长的区间中选出真正的随机数,有两种策略。
策略1:使用概率
选择一个区间的概率应该是这样的,即选择一个数字的概率保持不变。我们可以通过权衡发射较短射程的可能性来实现这一目标。
然而,不是计算概率权重,而是有更好的解决方案。见战略2。
策略2:合并范围
我们可以简单地将这三个范围合并成一个单独的范围。然后,从合并范围中随机选取一个数字。很简单:import random;
def randomPicker(howMany, *ranges):
mergedRange = reduce(lambda a, b: a + b, ranges);
ans = [];
for i in range(howMany):
ans.append(random.choice(mergedRange));
return ans;
让我们看看它的实际效果:>>> randomPicker(5, range(0, 10), range(15, 20), range(40, 60));
[47, 50, 4, 50, 16]
>>> randomPicker(5, range(0, 10), range(70, 90), range(40, 60));
[0, 9, 55, 46, 44]
>>> randomPicker(5, range(0, 10), range(40, 60));
[50, 43, 7, 42, 4]
>>>
randomPicker的另一个好处是它可以处理任意数量的范围。
希望这有帮助。