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 相关文章推荐
另类调用flash无须激活的方法
Dec 27 Javascript
js window.onload 加载多个函数的方法
Nov 02 Javascript
仿谷歌主页js动画效果实现代码
Jul 14 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
May 07 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
Aug 01 Javascript
js实现定时进度条完成后切换图片
Jan 04 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
Vue.js实现列表清单的操作方法
Nov 15 Javascript
详解JS函数stack size计算方法
Jun 18 Javascript
Vue中keep-alive组件的深入理解
Aug 23 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 adodb操作mysql数据库
2009/03/19 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
php实现文章评论系统
2019/02/18 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
用户注册常用javascript代码
2009/08/29 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
Python使用asyncio包处理并发详解
2017/09/09 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
python修改字典键(key)的方法
2019/08/05 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
django使用多个数据库的方法实例
2021/03/04 Python
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
介绍一下write命令
2012/09/24 面试题
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
国企干部对照检查材料
2014/08/22 职场文书
企业工会工作总结2015
2015/05/13 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
Java对文件的读写操作方法
2022/04/29 Java/Android