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 相关文章推荐
ASP中用Join和Array,可以加快字符连接速度的代码
Aug 22 Javascript
Jquery ThickBox插件使用心得(不建议使用)
Sep 08 Javascript
浅谈Javascript 执行顺序
Dec 18 Javascript
深入分析JQuery和JavaScript的异同
Oct 23 Javascript
javascript跨域原因以及解决方案分享
Apr 08 Javascript
jQuery实现图片加载完成后改变图片大小的方法
Mar 29 Javascript
AngularJS通过$location获取及改变当前页面的URL
Sep 23 Javascript
js创建对象几种方式的优缺点对比
Sep 28 Javascript
vue之浏览器存储方法封装实例
Mar 15 Javascript
深入浅析Node环境和浏览器的区别
Aug 14 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 Javascript
JavaScript实现瀑布流布局的3种方式
Dec 27 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写的小东西
2006/12/06 PHP
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
php微信开发之谷歌测距
2018/06/14 PHP
js身份证验证超强脚本
2008/10/26 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
Python列表切片用法示例
2017/04/19 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
对python sklearn one-hot编码详解
2018/07/10 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
python爬取招聘要求等信息实例
2020/11/20 Python
HTML5计时器小例子
2013/10/15 HTML / CSS
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
学习党章思想汇报
2014/01/07 职场文书
法律专业自荐信
2014/06/03 职场文书
2014年库房工作总结
2014/11/26 职场文书
2015最新婚礼主持词
2015/06/30 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers