Python 如何创建一个随机唯一数列表,以避免使用已经存在的随机唯一数列表中的数字?

Python 如何创建一个随机唯一数列表,以避免使用已经存在的随机唯一数列表中的数字?,python,Python,我正在尝试制作一台彩票机,它能从1-34生成7个中奖号码和3个奖金号码的列表。我希望奖金号码永远不要选择与中奖号码相同的号码 winning_numbers = random.sample(range(1, 34), 7) bonus_numbers = random.sample(range(1, 34), 3) 是否有任何命令/代码可以排除上一个列表中已选择的数字?random解决方案 如果只想使用随机模块,可以使用: import random nums = random.sample

我正在尝试制作一台彩票机,它能从1-34生成7个中奖号码和3个奖金号码的列表。我希望奖金号码永远不要选择与中奖号码相同的号码

winning_numbers = random.sample(range(1, 34), 7)
bonus_numbers = random.sample(range(1, 34), 3)

是否有任何命令/代码可以排除上一个列表中已选择的数字?

random
解决方案

如果只想使用
随机
模块,可以使用:

import random

nums = random.sample(range(1,35), 10)

winning_numbers = nums[:7]
bonus_numbers = nums[7:]

>>> winning_numbers
[2, 23, 29, 34, 26, 16, 13]

>>> bonus_numbers
[8, 4, 19]
As
random.sample
是“用于随机抽样,无需更换。”(引自)

numpy
解决方案

您还可以使用
numpy
,因为
numpy.random.choice
有一个
replace
参数,可以设置为
false
。(我个人很喜欢使用
numpy
随机数,因为它比
random
在更复杂的任务中提供了更大的灵活性。)


随机
解决方案

如果只想使用
随机
模块,可以使用:

import random

nums = random.sample(range(1,35), 10)

winning_numbers = nums[:7]
bonus_numbers = nums[7:]

>>> winning_numbers
[2, 23, 29, 34, 26, 16, 13]

>>> bonus_numbers
[8, 4, 19]
As
random.sample
是“用于随机抽样,无需更换。”(引自)

numpy
解决方案

您还可以使用
numpy
,因为
numpy.random.choice
有一个
replace
参数,可以设置为
false
。(我个人很喜欢使用
numpy
随机数,因为它比
random
在更复杂的任务中提供了更大的灵活性。)


开头的一句小但不重要的话:

无论您是先抽取前7个数字,然后从剩余的数字中抽取3个,还是立即抽取10个并将其拆分为7个中奖数字和3个奖金数字,在概率上都是绝对相等的

在第一种情况下,任何数字成为奖金数字的概率为:

在第二种情况下:

请注意,任何数字成为中奖数字的概率的推理是相同的

实现第一种情况实际上稍微长一点,但在使用
set
和时仍然相当简单。 下面是它的外观:

import random

# set of all potential numbers to draw from
all_numbers = set(range(1,35))  
# draw the winners
winning_numbers = set(random.sample(all_numbers, 7)  
# subtract the winners
remaining_numbers = all_numbers-winning_numbers  
# draw the bonus from the remaining numbers:
bonus_numbers = set(random.sample(remaining_numbers, 3)) 
第二种情况的实现是最小的,可能如下所示:

import random

drawn_numbers = random.sample(range(1,35), 10)
winning_numbers, bonus_numbers = drawn_numbers[:7], drawn_numbers[7:]

希望对大家有帮助,编码快乐

开头的一句很小但并非不重要的话:

无论您是先抽取前7个数字,然后从剩余的数字中抽取3个,还是立即抽取10个并将其拆分为7个中奖数字和3个奖金数字,在概率上都是绝对相等的

在第一种情况下,任何数字成为奖金数字的概率为:

在第二种情况下:

请注意,任何数字成为中奖数字的概率的推理是相同的

实现第一种情况实际上稍微长一点,但在使用
set
和时仍然相当简单。 下面是它的外观:

import random

# set of all potential numbers to draw from
all_numbers = set(range(1,35))  
# draw the winners
winning_numbers = set(random.sample(all_numbers, 7)  
# subtract the winners
remaining_numbers = all_numbers-winning_numbers  
# draw the bonus from the remaining numbers:
bonus_numbers = set(random.sample(remaining_numbers, 3)) 
第二种情况的实现是最小的,可能如下所示:

import random

drawn_numbers = random.sample(range(1,35), 10)
winning_numbers, bonus_numbers = drawn_numbers[:7], drawn_numbers[7:]
希望对大家有帮助,编码快乐

像这样的

import random
winning_numbers = random.sample(range(1, 34), 7)
bonus_numbers = []
while 1==1:
  num = random.randint(1,34)
  if len(bonus_numbers) == 3:
    break
  if num not in winning_numbers and num not in bonus_numbers:
    bonus_numbers.append(num)
像这样的

import random
winning_numbers = random.sample(range(1, 34), 7)
bonus_numbers = []
while 1==1:
  num = random.randint(1,34)
  if len(bonus_numbers) == 3:
    break
  if num not in winning_numbers and num not in bonus_numbers:
    bonus_numbers.append(num)

是的,有:)如果您一直绘制数字直到没有匹配项,会怎么样?检查此答案的可能重复项:注意,如果您想包括34之前的所有数字,您应该使用
范围(1,35)
。是的,有:)如果您一直绘制数字直到没有匹配项,会怎么样?检查此答案的可能重复项:注意,如果您想包括34之前的所有数字,您应该使用
范围(1,35)