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 相关文章推荐
使用prototype.js 的时候应该特别注意的几个问题.
Apr 12 Javascript
jquery获取radio值实例
Oct 16 Javascript
谈谈JavaScript异步函数发展历程
Sep 29 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
Dec 30 Javascript
深入解析js轮播插件核心代码的实现过程
Apr 14 Javascript
tween.js缓动补间动画算法示例
Feb 13 Javascript
layui关闭层级、简单监听的实例
Sep 06 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
Sep 06 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
Sep 17 Javascript
Js代码中的span拼接问题解决
Nov 22 Javascript
vue el-upload上传文件的示例代码
Dec 21 Vue.js
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 Vue.js
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/10/15 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
vue实现文件上传功能
2018/08/13 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
js实现计算器功能
2020/08/10 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
vue实现登录功能
2020/12/31 Vue.js
Python 创建子进程模块subprocess详解
2015/04/08 Python
Python3.x中自定义比较函数
2015/04/24 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
pandas.cut具体使用总结
2019/06/24 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
2020/09/05 Python
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
opencv实现图像几何变换
2021/03/24 Python
产品质量承诺书范文
2014/03/27 职场文书
质量承诺书范文
2014/03/27 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
公司经理聘任书
2014/03/29 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
房地产广告策划方案
2014/05/15 职场文书
校本研修个人总结
2015/02/28 职场文书
2015年社区综治工作总结
2015/04/21 职场文书