当前位置: 代码迷 >> C# >> 关于用 random 生成伪随机数的一个真迹
  详细解决方案

关于用 random 生成伪随机数的一个真迹

热度:802   发布时间:2016-04-28 08:37:40.0
关于用 random 生成伪随机数的一个手笔

  我在想还要不要写什么文字。确实不需要太多的文字描述吧。

  前奏插一个小话题,之前在网上看到这样的冷笑话(有图的),一个程序猿调试个程序,早上怀疑某某地方的错误,下午怀疑某某地方的错误,晚上怀疑某某地方可能错了,睡觉了还是辗转反侧难以入眠。第二天早上,再看看代码的时候,无意中找到了bug,漏下了逗号“,“,哈哈冷笑话。

  我这次也是疏忽了。在一个网站的项目中,用random去生成随机数,作为上传文件的名称。当然在需要用户上传的文件中是不容易遇到这个bug的。但是在做爬虫下载文件也用这个random生成随机数的话就很可能遇到这个bug了。因为我们是用当前时间的毫秒去种子的。这里有个致命的误区:以为毫秒很小,能产生不相同的种子。但是毫秒虽小,但是程序是高速运转的,高速到不可以思议,实际上在循环中产生的种子还是相同的。这一点我忽略了。

  描述结束,上图:

 

 

代码特写(注意产生随机数的方法):

 

 

结果:产生的随机数的重复率是很高的,基本上是能连续重复三四个。我猜想是因为一毫秒程序能走个过程三四遍。

 

 

我们换另一种测试方式,结果不要重复,在重复的情况下,就进入循环生成随机数。结果是生成了999个之后就进入死循环中了......

 

 

最后,我们修改了生成随机数的方法,确保在循环中每次random的种子是不相同的。it works !!!

 

 

我们再把循环去掉,发现,在不需要循环的情况下,一次性也能产生 10000 个不相同的随机数:

 

 

  原创:小明

  Email:[email protected]

  Date:2015/11/06

  原文链接:小明博客园-《关于用 random 生成伪随机数的一个手笔》

  相关解决方案