关于用 random 生成伪随机数的一个手笔
我在想还要不要写什么文字。确实不需要太多的文字描述吧。
前奏插一个小话题,之前在网上看到这样的冷笑话(有图的),一个程序猿调试个程序,早上怀疑某某地方的错误,下午怀疑某某地方的错误,晚上怀疑某某地方可能错了,睡觉了还是辗转反侧难以入眠。第二天早上,再看看代码的时候,无意中找到了bug,漏下了逗号“,“,哈哈冷笑话。
我这次也是疏忽了。在一个网站的项目中,用random去生成随机数,作为上传文件的名称。当然在需要用户上传的文件中是不容易遇到这个bug的。但是在做爬虫下载文件也用这个random生成随机数的话就很可能遇到这个bug了。因为我们是用当前时间的毫秒去种子的。这里有个致命的误区:以为毫秒很小,能产生不相同的种子。但是毫秒虽小,但是程序是高速运转的,高速到不可以思议,实际上在循环中产生的种子还是相同的。这一点我忽略了。
描述结束,上图:

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

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

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

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

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

原创:小明
Email:weimingyou@126.com
Date:2015/11/06
原文链接:小明博客园-《关于用 random 生成伪随机数的一个手笔》
关于用 random 生成伪随机数的一个手笔的更多相关文章
- js中Math.random()生成指定范围数值的随机数
http://www.111cn.net/wy/js-ajax/57062.htm Math.random() 这个方法相信大家都知道,是用来生成随机数的.不过一般的参考手册时却没有说明如何用这个方法 ...
- [转载]C# Random 生成不重复随机数
Random 类 命名空间:System 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. 伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,因为它 ...
- C# Random 生成不重复随机数
命名空间:System 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. 伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,因为它们是用一种确定的数 ...
- Python3-random模块-生成伪随机数
Python3中的random模块可以生成一个伪随机数 常用的就三个模块函数 random.random() 返回0-1之间的一个随机数 random.randrange(i, j) 返回一个随机数 ...
- C# random生成随机数全部一样
最近做排序测试 使用random生成随机数全部一样 估计是因为random采用的随机种子为时间戳 而一个循化执行消耗的时间没有到时间戳的最小单位 故没有变化 Thread.Sleep(10); 使用 ...
- 在使用Math.random()生成6位随机数遇到的问题,并成功得到6位随机数
最近在做卫生局的一个考务网时需要实现一个短信发送验证码的功能,因此就必须使用到随机生成6位验证码的功能,开始觉的简单的,随便写了个 +); String messageCode = String.va ...
- centos 阶段复习 2015-4-6 dd命令 hosts.allow和hosts.deny 啊铭的myssh脚本 清空history命令历史 /dev/zero 零发生器 /dev/null 黑洞 /dev/random 生成随机数 第十一节课
centos 阶段复习 2015-4-6 dd命令 hosts.allow和hosts.deny 啊铭的myssh脚本 清空history命令历史 /dev/zero 零发生器 /dev/nul ...
- Random 生成随机数
Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要 ...
- 关于 Math.random()生成指定范围内的随机数的公式推导
关于 Math.random()生成指定范围内的随机数的公式推导 在 java 中,用于生成随机数的 Math 方法 random()只能生成 0-1 之间的随机数,而对于生成指定区间,例如 a-b ...
随机推荐
- 【数学水题】【TOJ4113】【 Determine X】
题目大意: yuebai has a long sequence of integers A1,A2,-,AN. He also has such a function: F(x)=∑i=1N(⌊Ai ...
- cassandra + lucene集成
Stratio’s Cassandra Lucene Index Stratio’s Cassandra Lucene Index, derived from Stratio Cassandra, i ...
- Javascript 完美运动框架——逐行分析代码,让你轻松了解运动的原理
大家一听这名字就知道,有了这套框架 网上的效果基本都是可以实现的.实际上之前的运动框架还是有局限性的,就是不能让好几个值一块运动. 那这个问题怎么解决呢? 我们先来看看之前的运动框架 function ...
- Python 自学笔记(二)第一个程序 Hello World
一 打印 Hello world 1,输入 Python “Hello world” 即可 2,脚本文件输出Hello World 在命令行(cmd),输入 python 文件路径+文件名 3,为什么 ...
- makefile死磕笔记
开始我会插播一段我如何学习makefile的废话,如果不想听的话,请直接跳到我的makefile教程. 首先得先说明学习makefile真是一个痛苦的过程,尤其是用干巴巴的看书来学习的过程,简直可以用 ...
- Linux01--文件管理,常用命令 权限管理
一.Ø文件系统 1.Linux文件系统特点 • Linux文件系统为单根的树状结构 •文件系统根为”/” •文件名大小写敏感,除了”/”都是可用字符文件名以”.”开始的为隐藏文件 •文件路径使 ...
- 为WPF项目创建单元测试
原文作者: 周银辉 来源: 博客园 原文地址:http://www.cnblogs.com/zhouyinhui/archive/2007/09/30/911522.html 可能你已发现一个问题, ...
- C# 队列数据结构 (三)
队列是一种先进先出的线性表 因此需要引用Clist线性类 class CQueue { private Clist m_list;//构造链表对象实例 public CQueue()//构造函数 { ...
- MAC OS X 快捷键(自己总结)
command+space 可以切换键盘输入法:长按可进入输入法列表,并在多个输入法之间切换,输入法列表会根据你最近使用过的输入法自动调整排序. HID:00 00 91 00 00 00 00 00 ...
- VC操作Image的三种方法(收集)
忘记从哪来收集过来的资料了,暂且不管是哪位老兄写的,只道一声谢谢. 仅管VC有提供相应的API和类来操作bmp位图.图标和(增强)元文件,但却不支持jpg.gif和png等格式的图片,而这几种格式却是 ...