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 相关文章推荐
检测是否已安装 .NET Framework 3.5的js脚本
Feb 14 Javascript
JS数字抽奖游戏实现方法
May 04 Javascript
JQuery的attr 与 val区别
Jun 12 Javascript
详解Vue自定义过滤器的实现
Jan 10 Javascript
js获取json中key所对应的value值的简单方法
Jun 17 Javascript
Angular在模板驱动表单中自定义校验器的方法
Aug 09 Javascript
JS二分查找算法详解
Nov 01 Javascript
如何开发出更好的JavaScript模块
Dec 22 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
May 12 Javascript
详解iview的checkbox多选框全选时校验问题
Jun 10 Javascript
Vue实现手机计算器
Aug 17 Javascript
JS + HTML 罗盘式时钟的实现
May 21 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中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
javascript css styleFloat和cssFloat
2010/03/15 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
python实现的一个火车票转让信息采集器
2014/07/09 Python
python @property的用法及含义全面解析
2018/02/01 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
python实现彩票系统
2020/06/28 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
Python2与Python3的区别实例总结
2019/04/17 Python
python logging日志模块原理及操作解析
2019/10/12 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
运动会邀请函范文
2014/02/06 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
党务公开方案
2014/05/06 职场文书
教研活动主持词
2015/07/03 职场文书
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers