2017-05-26 66 views
0

我不擅長編碼,我正在努力改進和學習。我試圖編寫一個隨機選取6個非重複數字的代碼,但是我沒有做到這一點。我該怎麼辦?製作6個不同的隨機數字

import random 

a = random.randint(1, 100) 
b = random.randint(1, 100) 
c = random.randint(1, 100) 
x = random.randint(1, 100) 
y = random.randint(1, 100) 
z = random.randint(1, 100) 

outa = b, c, x, y, z 
outb = a, c, x, y, z 
outc = a, b, x, y, z 
outx = a, b, c, y, z 
outy = a, b, c, x, z 
outz = a, b, c, x, y 

all = a, b, c, x, y, z 

while a in outa or b in outb or c in outc or x in outx or y in outy or z in outz: 
    if a in outa: 
     a = random.randint(1,100) 
    elif b in outb: 
     b = random.randint(1,100) 
    elif c in outc: 
     c = random.randint(1,100) 
    elif x in outx: 
     x = random.randint(1,100) 
    elif y in outy: 
     y = random.randint(1,100) 
    elif z in outz: 
     z = random.randint(1,100) 

print(all) 
+1

你瞭解列表什麼? – Matt

+2

*「隨機選取6個非重複數字」*:'random.sample(range(1,100),6)' –

+0

這個問題中使用'sample'(除我的)之外的所有建議都缺少100個範圍。 '範圍'不包括結尾值,但'randint'確實。 – rodrigo

回答

0
all = a, b, c, x, y, z 

事情是這樣的創建的元組。所以在執行該行時,該元組具有固定值並且不能更改。當您更新最初用於構建它的某個變量時,它尤其不會發生變化。因此,您不能使用all作爲最終結果,或者使用outX元組來檢查任何重複項,因爲它們是固定的並且不會更新。

爲了讓您的代碼正常工作,您必須在while循環的每次迭代中重新創建所有這些元組。但總的來說,你會很快注意到有這些明確的變量不是一個好主意。

如果你想使用randint保持,那麼你可能只是每次生成一個號碼,「重投」當你遇到一些你已經有了:

numbers = [] 
while len(numbers) < 6: 
    num = random.randint(1, 100) 
    if num not in numbers: 
     numbers.append(num) 

我在這裏使用列表,這是一個可變數據結構來收集多個值(與元組相比,這是不可變的)。

您還可以使用random.sample這裏從一個數字範圍提供了一個更簡單的方法來得到任何數量的唯一值:

numbers = random.sample(range(1, 100), 6) 
0

像這樣:

random.sample(range(1,100), 6) 
+0

任何在採樣前將'range()'變成'set'的理由似乎會讓結果顯着變慢。 – AChampion

+0

我認爲你是對的,不需要這套。我會編輯。 – piokuc

1

有在random一個功能,做到了這一點:

all = random.sample(range(1,101), 6) 

如果可能的值列表過大而無法建立,那麼你的算法是好的,但更好的清單:

all = [] 
while len(all) < 6: 
    x = random.randint(1, 10000000) 
    if not x in all: 
     all.append(x) 

如果您的清單比6大很多,您可以考慮使用set而不是list

UPDATE:其實,random.sample()是非常聰明,並與python3此代碼:

all = random.sample(range(1,10000000001), 6) 

作品就好了,而這一個:

all = random.sample(list(range(1,10000000001)), 6) 

吃我所有的記憶。

如果你使用python2,你可以使用xrange而不是range來獲得相同的效果。

0

而不是創建6個不同的變量,您可以創建器使用random.sample 6個唯一編號列表:

import random 

nums = random.sample(range(1,100), 6) 
print (nums) 

Output: 
[2,34,5,61,99,3]