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 相关文章推荐
Gird事件机制初级读本
Mar 10 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
Nov 18 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
Apr 16 Javascript
Javascript遍历table中的元素示例代码
Jul 08 Javascript
学习JavaScript设计模式(封装)
Nov 26 Javascript
Javascript操作表单实例讲解(下)
Jun 20 Javascript
jquery代码规范让代码越来越好看
Feb 03 Javascript
JavaScript实现区块链
Mar 14 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
Nov 07 Javascript
vue+swiper实现左右滑动的测试题功能
Oct 30 Javascript
前端实现滑动按钮AJAX与后端交互的示例代码
Feb 24 Javascript
小程序实现侧滑删除功能
Jun 25 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 设计模式之 单例模式
2008/12/19 PHP
php中去除所有js,html,css代码
2010/10/12 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
Django 批量插入数据的实现方法
2020/01/12 Python
Python 解析简单的XML数据
2020/07/24 Python
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
应届生的求职推荐信范文
2013/11/30 职场文书
公司出纳岗位职责
2013/12/07 职场文书
运动会解说词50字
2014/01/18 职场文书
总经理的岗位职责
2014/02/23 职场文书
项目投资意向书
2014/04/01 职场文书
2014年度考核工作总结
2014/12/24 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
告知书格式
2015/07/01 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题