2017-06-02 54 views
0

所以,我在課堂上被問到使用特定的隨機種子237.但我不知道如何正確實施它。例如,這是我的代碼。 in python 3。 在這個例子中,我基本上拋出m個骰子數量爲k的邊,並試圖返回一個長度爲m的元組。如何在python 3的隨機種子上使用randrange()?

import random 
rng=random.seed(237) 
# create random number generator 

def throwDice(m, k): 
    x = 0 
    L = [] 
    while x < m : 
     die = rng.randrange(1,k+1) 
     L.append(die) 
     x+=1 
    return print(tuple(L)) 
throwDice(11,5) 

然而,在命令提示符下不斷顯示錯誤

die = rng.randrange(1,k+1) 
AttributeError: 'NoneType' object has no attribute 'randrange'` 

我能得到什麼錯:(

+0

種子基本上告訴你的隨機數發生器如何是隨機的(使用相同的種子,它總是會選擇相同的數字)。你想要的就是這樣調用它:'die = random.randrange(1,k + 1)' – Kai

回答

2

很簡單的解釋:在第二行,你創建了一個對象,rng,這是random.seed(237)的返回值,恰巧random.seed總是返回None,所以後來在你的代碼中,當你嘗試rng.randrange時,Python會查找一個attr ibute命名爲randrangerng對象。但rng對象是None,它沒有randrange屬性。

你的意思只是random.randrange(1, k+1)而不是rng.randrange(1, k+1)

+0

好的,如果我導入種子,我不必在代碼中引用它。我可以使用random.randrange()? –

+0

對不起,遲到了,但是。你可以通過設置種子來嘗試,然後詢問一個隨機數(或範圍)。如果您然後重新設置種子爲相同的值,並要求另一個隨機數(或範圍)它應該是相同的。 – acdr

1

random.seed回報None,所以在

rng=random.seed(237) 

rng被設置爲None。然後你嘗試撥打

None.randrange(1,k+1) 

在你的功能,顯然這是行不通的。

此外,print函數返回None,所以

return print(tuple(L)) 

將返回None。你不想那樣。

下面是您的代碼的修復版本。

import random 

random.seed(237) 

# create random number generator 
def throwDice(m, k): 
    L = [] 
    for x in range(m): 
     die = random.randrange(1, k+1) 
     L.append(die) 
    return tuple(L) 

print(throwDice(11, 5)) 

輸出

(5, 4, 2, 2, 4, 1, 2, 5, 4, 5, 1) 

在Python 2裏,你會得到這樣的輸出:

(4, 5, 5, 4, 1, 1, 4, 5, 3, 3, 1) 

我已經使用了for環能進行骰子的期望數量卷,這比使用while循環和「手動「用x += 1對捲進行計數。我們實際上並沒有在該循環中使用x的值,並且在Python中使用_作爲循環變量的名稱是一種常見慣例,即,

for _ in range(m): 

FWIW,我們可以通過使用生成器表達式寫在一個緊湊的時尚此功能:

def throwDice(m, k): 
    return tuple(random.randrange(1, k+1) for _ in range(m)) 

在某些情況下,我們需要多個獨立的隨機數流。我們可以通過創建一個Random類的實例來輕鬆完成此操作;該類的構造函數將seed作爲可選參數。

import random 

# Create a random number generator, and seed it 
myrandom = random.Random(237) 

def throwDice(m, k): 
    L = [] 
    for _ in range(m): 
     die = myrandom.randrange(1, k+1) 
     L.append(die) 
    return tuple(L) 
+0

隨着Python 3.6可以使用'random.choices'並保存顯式循環我認爲 –

+0

@Chris_Rands是正確的,但由於這是作業,所以OP可能需要使用'randrange'。 TBH,我一直忘記存在「選擇」。 :)對於這個任務,我可能會使用'randint(1,k)'。 –