2017-05-09 22 views
-1

我試圖從兩個隨機選擇的列表中獲取常見元素的數量,如您在本文後面的代碼中所見。如何獲得隨機函數的固定值?

的一個問題是

print(count_matching_numbers(generate_numbers(), draw_winning_numbers())) 

上述打印功能的結果是基於哪個DEF。打印一個內部功能獨立地選自

def generate_numbers(): 
    result = random.sample(range(1, 46), 6) 
    result.sort() 
    return result 

def draw_winning_numbers(): 
    win = generate_numbers() 
    for i in win: 
     bonus = random.randint(1, 45) 
     bonus not in win 
    win.append(bonus) 
    return win 

簡而言之生成輸出,否,我想獲得的隨機函數的一固定的輸出。 我該怎麼做才能解決問題?

預先感謝您!


import random 

def generate_numbers(): 
    result = random.sample(range(1, 46), 6) 
    result.sort() 
    return result 

def draw_winning_numbers(): 
    win = generate_numbers() 
    for i in win: 
     bonus = random.randint(1, 45) 
     bonus not in win 
    win.append(bonus) 
    return win 

def count_matching_numbers(list1, list2): 
    return len(set(list1) & set(list2)) 


print(generate_numbers()) 
print(draw_winning_numbers()) 
print(count_matching_numbers(generate_numbers(), draw_winning_numbers())) 
+2

你可以一)硬編碼值,或者b)設置隨機種子 –

+0

@PaulH:或c)使用'unittest.mock()'並修補'sample'和'randint'來返回預定義的數字。雖然不如設定種子那麼簡單。 –

+0

但最重要的是,OP不應該兩次調用函數。改用變量。 –

回答

1

的問題是,這三個print內,該函數將單獨調用。你可以在函數結果賦值給一些變量,然後將變量傳遞給這樣的最後一個函數:

import random 

def generate_numbers(): 
    result = random.sample(range(1, 46), 6) 
    result.sort() 
    return result 

def draw_winning_numbers(): 
    win = generate_numbers() 
    for i in win: 
     bonus = random.randint(1, 45) 
     bonus not in win 
    win.append(bonus) 
    return win 

def count_matching_numbers(list1, list2): 
    return set(list1) & set(list2) 

from_generate = generate_numbers() # call function only once 
from_draw_winning = draw_winning_numbers() # call function only once 

print(from_generate) 
print(from_draw_winning) 
print(count_matching_numbers(from_generate, from_draw_winning)) 

輸出將是:

[3, 16, 23, 24, 34, 35] 
[3, 11, 22, 23, 34, 39, 36] 
set([34, 3, 23])