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 相关文章推荐
AJAX架构之Dojo篇
Apr 10 Javascript
window.location和document.location的区别分析
Dec 23 Javascript
jquery插件jbox使用iframe关闭问题
Feb 09 Javascript
一个挺有意思的Javascript小问题说明
Sep 26 Javascript
javascript时间函数基础介绍
Mar 28 Javascript
js使用for循环与innerHTML获取选中tr下td值
Sep 26 Javascript
JavaScript 正则表达式中global模式的特性
Feb 25 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
May 11 Javascript
jQuery实现网页拼图游戏
Apr 22 jQuery
jQuery+ThinkPHP实现图片上传
Jul 23 jQuery
AJAX学习笔记
May 18 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脚本的10个技巧(3)
2006/10/09 PHP
两个php日期控制类实例
2014/12/09 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
javascript 函数式编程
2007/08/16 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
python 堆和优先队列的使用详解
2019/03/05 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
python字符串下标与切片及使用方法
2020/02/13 Python
使用Python封装excel操作指南
2021/01/29 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
CSS3制作ajax loader icon实现思路及代码
2013/08/25 HTML / CSS
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
保密工作实施方案
2014/02/24 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
2016关于军训的心得体会
2016/01/11 职场文书