JavaScript 产生不重复的随机数三种实现思路


Posted in Javascript onDecember 13, 2012

在 JavaScript 中,一般产生的随机数会重复,但是有时我们需要不重复的随机数,如何实现?下面就来讲解三种方法产生不重复的随机数,并进行比较,看那种方法效率高。

方法一
思路:首先创建一个1到3000的数组,每次取一个数,然后去除数组中取出的这个数, 这样就可以实现永不重复。

<script type="text/javascript"> 
var count=3000; 
var originalArray=new Array;//原数组 
//给原数组originalArray赋值 
for (var i=0;i<count;i++){ 
originalArray[i]=i+1; 
} 
var d1=new Date().getTime(); 
for (i=0;i<count;i++){ 
var index=Math.floor(Math.random()*originalArray.length); //随机取一个位置 
document.write(index+" , "); 
originalArray.splice(index,1); 
} 
var d2=new Date().getTime(); 
document.write("运算耗时"+(d2-d1)); 
</script>

性能:耗时 1528 毫秒。

方法二
思路:对方法一的slice方法进行改进,以提高效率。还是从原数组取出一个数, 然后让原数组的这个位置赋值为null 。下一次取数时判断是否为null,如果是null就不取。

<script type="text/javascript"> 
var count=3000; 
var originalArray=new Array;//原数组 
//给原数组originalArray赋值 
for (var i=0;i<count;i++){ 
originalArray[i]=i+1; 
} 
var d1=new Date().getTime(); 
for (var num,i=0;i<count;i++){ 
do{ 
num=Math.floor(Math.random()*count); 
}while(originalArray[num]==null); 
document.write(originalArray[num]+" , "); 
originalArray[num]=null; 
} 
var d2=new Date().getTime(); 
document.write("运算耗时"+(d2-d1)); 
</script>

性能:耗时 290 毫秒。

方法三
思路:把原数组打散,然后再依次输出, 这样也可以做到随机永不重复,且效率更高。

<script type="text/javascript"> 
var count=3000; 
var originalArray=new Array;//原数组 
//给原数组originalArray赋值 
for (var i=0;i<count;i++){ 
originalArray[i]=i+1; 
} 
var d1=new Date().getTime(); 
originalArray.sort(function(){ return 0.5 - Math.random(); }); 
for (var i=0;i<count;i++){ 
document.write(originalArray[i]+" , "); 
} 
var d2=new Date().getTime(); 
document.write("运算耗时"+(d2-d1)); 
</script>

性能:耗时 229 毫秒。
通过性能分析,得出方法三为最佳方案。
Javascript 相关文章推荐
你所要知道JS(DHTML)中的一些技巧
Jan 09 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
Aug 13 Javascript
js修改table中Td的值(定义td的单击事件)
Jan 10 Javascript
文本域中换行符的替换示例
Mar 04 Javascript
详解JavaScript中的客户端消息框架设计原理
Jun 24 Javascript
纯javascript制作日历控件
Jul 17 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
Sep 19 Javascript
jQuery学习之DOM节点的插入方法总结
Jan 22 Javascript
浅谈React中组件间抽象
Jan 27 Javascript
深入理解JS的事件绑定、事件流模型
May 13 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
Jul 10 jQuery
解决layui 表单元素radio不显示渲染的问题
Sep 04 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 #Javascript
js onkeypress与onkeydown 事件区别详细说明
Dec 13 #Javascript
javascript 文件的同步加载与异步加载实现原理
Dec 13 #Javascript
javaScript复制功能调用实现方案
Dec 13 #Javascript
js遍历td tr等html元素
Dec 13 #Javascript
js关闭模态窗口刷新父页面或跳转页面
Dec 13 #Javascript
HTML复选框和单选框 checkbox和radio事件介绍
Dec 12 #Javascript
You might like
php实现文件下载更能介绍
2012/11/23 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
$.each与$().each的区别示例介绍
2014/03/20 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
使用canvas进行图像编辑的实例
2017/08/29 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
Python使用turtule画五角星的方法
2015/07/09 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
安全标准化实施方案
2014/02/20 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
建党伟业观后感
2015/06/01 职场文书
驻村工作简报
2015/07/20 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis