LHD*_*HDZ 8 python random integer
我在从(a,b)的不同集合中生成X量的随机整数时遇到了困惑.例如,我想生成来自(1,5),(9,15)和(21,27)的5个随机整数.我的代码生成5个随机整数,但只有21到27之间,而不是其他两个.理想情况下,我希望看到1,4,13,22,25而不是21,21,25,24,27.
我的代码:
from random import randint
n = 0
while n < 5:
n += 1
for i in (randint(1,5),randint(9,15),randint(21,27)):
x = i
print i
Run Code Online (Sandbox Code Playgroud)
fur*_*ras 10
不理想
from random import randint, choice
for _ in range(5):
print(choice([randint(1,5),randint(9,15),randint(21,27)]))
Run Code Online (Sandbox Code Playgroud)
正如Blender所说 - 更清晰的版本
from random import randint, choice
for _ in range(5):
r = choice([(1,5),(9,15),(21,27)])
print(randint(*r))
Run Code Online (Sandbox Code Playgroud)
你好!
这是个有趣的问题; 当您意识到要实现真正的随机性时,选择特定范围的概率必须由该范围的长度来衡量,这变得很有趣。
如果三个范围的长度相等,则说 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;
Run Code Online (Sandbox Code Playgroud)
让我们看看它的实际效果:
>>> 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]
>>>
Run Code Online (Sandbox Code Playgroud)
的另一个好处randomPicker是它可以处理任意数量的范围。
希望这可以帮助。
小智 5
import itertools, random
nums = list(itertools.chain(
range(1,5),
range(9,15),
range(21,27)))
random.choices(nums, k=5)
Run Code Online (Sandbox Code Playgroud)