我在想還要不要寫什么文字。確實(shí)不需要太多的文字描述吧。
前奏插一個(gè)小話題,之前在網(wǎng)上看到這樣的冷笑話(有圖的),一個(gè)程序猿調(diào)試個(gè)程序,早上懷疑某某地方的錯(cuò)誤,下午懷疑某某地方的錯(cuò)誤,晚上懷疑某某地方可能錯(cuò)了,睡覺了還是輾轉(zhuǎn)反側(cè)難以入眠。第二天早上,再看看代碼的時(shí)候,無意中找到了bug,漏下了逗號(hào)“,“,哈哈冷笑話。
我這次也是疏忽了。在一個(gè)網(wǎng)站的項(xiàng)目中,用random去生成隨機(jī)數(shù),作為上傳文件的名稱。當(dāng)然在需要用戶上傳的文件中是不容易遇到這個(gè)bug的。但是在做爬蟲下載文件也用這個(gè)random生成隨機(jī)數(shù)的話就很可能遇到這個(gè)bug了。因?yàn)槲覀兪怯卯?dāng)前時(shí)間的毫秒去種子的。這里有個(gè)致命的誤區(qū):以為毫秒很小,能產(chǎn)生不相同的種子。但是毫秒雖小,但是程序是高速運(yùn)轉(zhuǎn)的,高速到不可以思議,實(shí)際上在循環(huán)中產(chǎn)生的種子還是相同的。這一點(diǎn)我忽略了。
描述結(jié)束,上圖:
代碼特寫(注意產(chǎn)生隨機(jī)數(shù)的方法):
結(jié)果:產(chǎn)生的隨機(jī)數(shù)的重復(fù)率是很高的,基本上是能連續(xù)重復(fù)三四個(gè)。我猜想是因?yàn)橐缓撩氤绦蚰茏邆€(gè)過程三四遍。
我們換另一種測試方式,結(jié)果不要重復(fù),在重復(fù)的情況下,就進(jìn)入循環(huán)生成隨機(jī)數(shù)。結(jié)果是生成了999個(gè)之后就進(jìn)入死循環(huán)中了......
最后,我們修改了生成隨機(jī)數(shù)的方法,確保在循環(huán)中每次random的種子是不相同的。it works !!!
我們?cè)侔蜒h(huán)去掉,發(fā)現(xiàn),在不需要循環(huán)的情況下,一次性也能產(chǎn)生 10000 個(gè)不相同的隨機(jī)數(shù):
原創(chuàng):小明
Email:weimingyou@126.com
Date:2015/11/06
原文鏈接:小明博客園-《關(guān)于用 random 生成偽隨機(jī)數(shù)的一個(gè)手筆》
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注