我在想還要不要寫什麼文字。確實不需要太多的文字描述吧。
前奏插一個小話題,之前在網上看到這樣的冷笑話(有圖的),一個程序猿調試個程序,早上懷疑某某地方的錯誤,下午懷疑某某地方的錯誤,晚上懷疑某某地方可能錯了,睡覺了還是輾轉反側難以入眠。第二天早上,再看看代碼的時候,無意中找到了bug,漏下了逗號“,“,哈哈冷笑話。
我這次也是疏忽了。在一個網站的項目中,用random去生成隨機數,作為上傳文件的名稱。當然在需要用戶上傳的文件中是不容易遇到這個bug的。但是在做爬蟲下載文件也用這個random生成隨機數的話就很可能遇到這個bug了。因為我們是用當前時間的毫秒去種子的。這裡有個致命的誤區:以為毫秒很小,能產生不相同的種子。但是毫秒雖小,但是程序是高速運轉的,高速到不可以思議,實際上在循環中產生的種子還是相同的。這一點我忽略了。
描述結束,上圖:
代碼特寫(注意產生隨機數的方法):
結果:產生的隨機數的重復率是很高的,基本上是能連續重復三四個。我猜想是因為一毫秒程序能走個過程三四遍。
我們換另一種測試方式,結果不要重復,在重復的情況下,就進入循環生成隨機數。結果是生成了999個之後就進入死循環中了......
最後,我們修改了生成隨機數的方法,確保在循環中每次random的種子是不相同的。it works !!!
我們再把循環去掉,發現,在不需要循環的情況下,一次性也能產生 10000 個不相同的隨機數:
原創:小明
Email:[email protected]
Date:2015/11/06
原文鏈接:小明博客園-《關於用 random 生成偽隨機數的一個手筆》