如何制作一个随机唯一数字列表,避免使用已有的随机唯一数字列表中的数字?

时间:2018-04-11 19:29:41

标签: python

我正在尝试制作一个彩票机,从1-34生成7个中奖号码和3个奖励号码的列表。我希望奖金数字永远不会与中奖号码相同。

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

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

3 个答案:

答案 0 :(得分:2)

random解决方案

如果您只想使用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]

由于random.sample是"用于随机抽样而无需替换。" (引自docs

numpy解决方案

您还可以使用numpy,因为numpy.random.choice有一个replace参数,您可以设置为false。 (我个人是粉丝或使用numpy获取随机数,因为它比random更复杂的任务提供了更大的灵活性

import numpy as np

nums = np.random.choice(range(1,35), 10, replace=False)

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


>>> winning_numbers
array([27,  4, 17, 30, 32, 21, 23])

>>> bonus_numbers
array([15, 13, 18])

答案 1 :(得分:2)

一开始的一个小但不重要的评论:

你是先绘制7个数字,然后是剩下的3个数字,还是10个数字,然后将它们分成7个中奖号码,3个奖励数字在概率方面完全相同

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

first7then3

在第二个:

all10then3

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

实施第一个案例实际上稍微长一些,但在使用l1CoreCache.loadCache(null); l1LookupCache.loadCache(null); System.out.println(l1CoreCache.size(CachePeekMode.ONHEAP)); System.out.println(l1CoreCache.size(CachePeekMode.OFFHEAP)); System.out.println(l1LookupCache.size(CachePeekMode.ONHEAP)); System.out.println(l1LookupCache.size(CachePeekMode.OFFHEAP)); set operations时仍然相当简单。 以下是它的外观:

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)) 

希望有帮助和快乐的编码!

答案 2 :(得分:0)

这样的东西?

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)