[英]How do i make a list of random unique numbers that avoid using numbers from an already existing list of random unique numbers?
我正在嘗試制作一種彩票機,該彩票機從1-34生成7個中獎號碼和3個獎金號碼的列表。 我希望獎金號碼永遠不要選擇與中獎號碼相同的號碼。
winning_numbers = random.sample(range(1, 34), 7)
bonus_numbers = random.sample(range(1, 34), 3)
是否有任何命令/代碼可以排除上一個列表中已經選擇的數字?
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
是“用於無替換的隨機抽樣”。 (摘自文檔 )
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])
在開始時有一個簡短但不重要的說明:
無論您是先抽出7個數字,然后從其余數字中抽出3個,還是立即抽出10個並將其分為7個中獎數字和3個獎勵數字,就概率而言,絕對相等 :
在第一種情況下,任何數字成為獎勵數字的可能性為:
在第二個中:
注意,任何數字作為中獎號碼的可能性的理由都是相同的。
實際上, 實現第一種情況的時間略長,但是在使用set
和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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.