这是一个有趣的问题;当您意识到要实现真正的随机性,选择特定范围的概率必须通过该范围的长度来衡量时,就会变得有趣。
等长范围:
如果三个范围的长度相等,比如 range(0, 10)、range(20, 30) 和 range(40, 50);然后,要选择一个随机数,我们可以执行以下操作:
- 随机选择一个范围。
- 从该范围内选择一个随机数。
长度不等的范围:
现在,考虑三个大小不等的范围,例如 range(0, 2)、range(4, 6) 和 range(10, 100);
第三个范围比前两个大得多。如果我们在处理同样长的范围时采用相同的策略,我们将偏向于从前两个范围中选择数字。
为了从三个不等长的范围中选择真正的随机数,有两种策略。
策略 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 的另一个好处是它可以处理任意数量的范围。