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 相关文章推荐
javascript之通用简单的table选项卡实现(二)
May 09 Javascript
收集的10个免费的jQuery相册
Feb 26 Javascript
js实现收缩菜单效果实例代码
Oct 30 Javascript
javascript常见操作汇总
Sep 03 Javascript
文字垂直滚动之javascript代码
Jul 29 Javascript
如何使用jquery修改css中带有!important的样式属性
Apr 28 Javascript
javascript宿主对象之window.navigator详解
Sep 07 Javascript
关于Bootstrap按钮组件消除黄框的方法
May 19 Javascript
浅谈Angular4实现热加载开发旅程
Sep 08 Javascript
浅谈javascript中的prototype和__proto__的理解
Apr 07 Javascript
taro开发微信小程序的实践
May 21 Javascript
JavaScript实现无限轮播效果
Nov 19 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
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
javascript实现密码强度显示
2015/03/18 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
python 构造三维全零数组的方法
2018/11/12 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
Python中生成ndarray实例讲解
2021/02/22 Python
HTML5中的新元素介绍
2008/10/17 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
美国在线购物频道:Shop LC
2019/04/21 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
为什么使用接口?
2014/08/13 面试题
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
助人为乐表扬信范文
2014/01/14 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
万能检讨书2000字
2014/10/17 职场文书
单位收入证明范本
2015/06/18 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
远程教育培训心得体会
2016/01/09 职场文书
入党申请书怎么写?
2019/06/11 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python
Spring中的@Transactional的工作原理
2022/06/05 Java/Android