2014-01-06 63 views
3

我有一個很難搞清楚如何下面的代碼工作:fizzbuzz在Python中使用隨機,它是如何工作的?

import random 

for i in range(0, 100): 
    if not i % 15: 
     random.seed(1178741599) 
    print [i+1, "Fizz", "Buzz", "FizzBuzz"][random.randint(0,3)] 

我明白,當i是整除15random將使用相同的seed,因此randint(0, 3)總是會返回相同的索引,但當我試圖

for i in range(100): 
    random.seed(1178741599) 
    print random.randint(0,3) #always print 0 

上述代碼始終打印0不應它是3(作爲"FizzBuzz"的在升指數ist [i+1, "Fizz", "Buzz", "FizzBuzz"](這是正確的行爲,並對應於i+1在列表中。)

i35整除怎麼樣?

什麼是種子1178741599的神奇?

編輯:作爲jonrsharpe指出的那樣,fizzbuzz代碼只能在Python 2.x的

回答

6
random.seed(n) 

的意思是「隨機數發生器復位到一些已知位置n」。這意味着發電機的未來輸出可以預先知道。一次又一次地使用相同的「隨機」數據進行測試非常有用。

這段代碼的作用是每隔15個步驟重置發生器,因此每次都會得到15個「隨機」整數的序列(因此也是列表中的字符串)。在Python 2.x中,重置後的第一個「隨機」整數始終爲0(當我在Python 3中嘗試時,在random.seed(1178741599)後我得到random.randint(0, 3) == 1)。

請注意,此代碼不會做一個傳統的FizzBu​​zz程序做什麼,並且很大程度上取決於random實現。它適用於我的2.7.3,但不適用於3.3.2的(請參閱Why is seeding the random number generator not stable between versions of Python?)。

+0

現在我有了一個更好的理解。因此,由於這個特殊種子的'魔術',它的前15個隨機整數正是fizzbuzz在[i + 1,Fizz,Buzz,FizzBu​​zz]中選取正確元素所需要的。我想你不應該得到'1',因爲'i + 1'的索引爲'0'。 –

+0

這是正確的,但正如我剛剛添加它似乎並沒有工作在Python 3.x – jonrsharpe

+0

我剛剛在Python 3.3中嘗試,你是對的,它總是產生'1' –

1

這裏有一個簡單的方式去尋找種子爲您隨機數生成器:

import random 

expected = [0, 0, 1, 0, 2, 
      1, 0, 0, 1, 2, 
      0, 1, 0, 0, 3] 

def is_working_seed(s): 
    random.seed(s) 
    return all(random.randint(0, 3) == e for e in expected) 

seed = 0 
while not is_working_seed(seed): 
    seed += 1 

print seed 

(顯然,遍歷種子的所有2^32的值是不是一個好的計劃)

由於在0:4中有4**15 == 1073741824種隨機數列表的生成方式,因此您預計在32位數字空間中會有大約4個種子。

+0

好分析的種子,現在我想知道如果有一種有效的方式或某種理論方法來尋找合適的種子...... –