如何创建一个随机的整数列表,但排除某个数字



我想在python中创建一个随机的数字列表,但排除了某个数字k。

我可以创建一个随机的整数列表:l = [random.randint(0,10) for i in range(5)]然后我可以去掉数字k,如果它在那里的话,并在这个范围内添加另一个随机数,但这似乎太多了。

在研究这一点时,很容易找到如何从一个范围中创建一个随机数并排除某个数字,例如:print (choice([i for i in range(0,9) if i not in [2,5,7]]))我可以按创建数组所需的次数执行此操作,但这似乎比必要的更复杂。

非常感谢您对的反馈

列出范围内的数字,并从列表中删除k。然后可以使用random.choices()从列表中选择多个元素。

numbers = list(range(0, 11))
numbers.remove(k)
result = random.choices(numbers, k=5)

您可以编写一个生成器,生成您选择的随机数,并使用第一个n:

def random_numbers_except(a, b, exclusions):
while True:
while (choice := random.randint(a, b)) in exclusions:
pass
yield choice
numbers = [number for _, number in zip(range(5), random_numbers_except(0, 10, [2, 5, 7]))

您还可以创建生成器,并在列表理解中使用它。

def my_random_generator(n_values, min_value, max_value, excluded_values=None):
if excluded_values is None:
excluded_values = []
count = 0
while count < n_values:
value = random.randint(min_value, max_value)
while value in excluded_values:
value = random.randint(min_value, max_value)
yield value
count += 1

# Then
l = [_ for _ in my_random_generator(5, 0, 10, [2, 5, 7])]
# Or, (added after the discussion below)
l = list(my_random_generator(5, 0, 10, [2, 5, 7]))

您可以生成所需范围的随机数,并减去要排除的数字数量。只要选择了一个特殊数字,就可以将其映射到范围的末尾。

这有道理吗?如果没有,也许代码会:

import random
random_range = range(0,1000)
exclude = [5, 55, 555]
def generate(n:int, ran: range, exclude:list):
exclusive_range = range(ran.start, ran.stop-len(exclude))
randoms = []
for i in range(n):
r = random.choice(exclusive_range)
if r in exclude:
r = exclusive_range.stop + exclude.index(r)
randoms.append(r)
return randoms
x = generate(1000, random_range, exclude)

在我的示例中,5将映射到997,55将平移到998,555将映射到999。

您可以从短一个的范围中选择随机数,然后对于每个单独的选择,当其大于或等于k时,将其加1:

import random
k = 50  # number to exclude
n = 100  # range: choices should be in {0,...,49,51,...,99}
rnd = random.randrange(0, n - 1)  # in {0,...,98}
rnd += int(rnd >= k)

最新更新