关于用 random 生成伪随机数的一个手笔
我在想还要不要写什么文字。确实不需要太多的文字描述吧。
前奏插一个小话题,之前在网上看到这样的冷笑话(有图的),一个程序猿调试个程序,早上怀疑某某地方的错误,下午怀疑某某地方的错误,晚上怀疑某某地方可能错了,睡觉了还是辗转反侧难以入眠。第二天早上,再看看代码的时候,无意中找到了bug,漏下了逗号“,“,哈哈冷笑话。
我这次也是疏忽了。在一个网站的项目中,用random去生成随机数,作为上传文件的名称。当然在需要用户上传的文件中是不容易遇到这个bug的。但是在做爬虫下载文件也用这个random生成随机数的话就很可能遇到这个bug了。因为我们是用当前时间的毫秒去种子的。这里有个致命的误区:以为毫秒很小,能产生不相同的种子。但是毫秒虽小,但是程序是高速运转的,高速到不可以思议,实际上在循环中产生的种子还是相同的。这一点我忽略了。
描述结束,上图:
代码特写(注意产生随机数的方法):
结果:产生的随机数的重复率是很高的,基本上是能连续重复三四个。我猜想是因为一毫秒程序能走个过程三四遍。
我们换另一种测试方式,结果不要重复,在重复的情况下,就进入循环生成随机数。结果是生成了999个之后就进入死循环中了......
最后,我们修改了生成随机数的方法,确保在循环中每次random的种子是不相同的。it works !!!
我们再把循环去掉,发现,在不需要循环的情况下,一次性也能产生 10000 个不相同的随机数:
原创:小明
Email:weimingyou@126.com
Date:2015/11/06
原文链接:小明博客园-《关于用 random 生成伪随机数的一个手笔》