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 相关文章推荐
jQuery 判断页面元素是否存在的代码
Aug 14 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
Jul 17 Javascript
jquery 定位input元素的几种方法小结
Jul 28 Javascript
jquery统计复选框选中示例
Nov 05 Javascript
JS判断对象是否存在的10种方法总结
Dec 23 Javascript
JavaScript学习笔记之JS函数
Jan 22 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
微信小程序 获取设备信息 API实例详解
Oct 02 Javascript
快速入门Vue
Dec 19 Javascript
axios学习教程全攻略
Mar 26 Javascript
vue-cli webpack 引入jquery的方法
Jan 10 jQuery
基于JS+HTML实现弹窗提示是否确认提交功能
Jun 17 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
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
php算法实例分享
2015/07/14 PHP
javascript高级学习笔记整理
2011/08/14 Javascript
js中function()使用方法
2013/12/24 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
在Django中限制已登录用户的访问的方法
2015/07/23 Python
python+django+sql学生信息管理后台开发
2018/01/11 Python
简单实现python聊天程序
2018/04/01 Python
对python中的argv和argc使用详解
2018/12/15 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
python3.8下载及安装步骤详解
2020/01/15 Python
Django ModelForm操作及验证方式
2020/03/30 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
印度在线杂货店:bigbasket
2018/08/23 全球购物
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
中学社团活动总结
2015/05/07 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
js之ajax文件上传
2021/05/13 Javascript