Python-如何生成具有多个范围的随机整数?

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)

  • `random.randint(*random.choice([(1,5),(9,15),(21,27)]))`有点清楚. (5认同)
  • @Blender:在处理长度不等的范围时,此解决方案偏向于较短的范围。请参阅我的答案以了解我的意思。 (2认同)

Sum*_*rve 7

你好!

这是个有趣的问题; 当您意识到要实现真正的随机性时,选择特定范围的概率必须由该范围的长度来衡量,这变得很有趣。

等长范围:

如果三个范围的长度相等,则说 range(0, 10), range(20, 30) 和 range(40, 50);然后,要选择一个随机数,我们可以执行以下操作:

  1. 随机选择一个范围。
  2. 从该范围中选择一个随机数。

不等长的范围:

现在,考虑三个大小不等的范围,比如 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)