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操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
Sep 26 Javascript
JS 非图片动态loading效果实现代码
Apr 09 Javascript
JavaScript的parseInt 取整使用
May 09 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
Aug 30 Javascript
js实现不重复导入的方法
Mar 02 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
Mar 02 Javascript
详解JavaScript的另类写法
Apr 11 Javascript
JavaScript判断微信浏览器实例代码
Jun 13 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
Oct 10 Javascript
Node.js中用D3.js的方法示例
Jan 16 Javascript
webuploader分片上传的实现代码(前后端分离)
Sep 10 Javascript
vue select 获取value和lable操作
Aug 28 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
header()函数使用说明
2006/11/23 PHP
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
angularJs关于指令的一些冷门属性详解
2016/10/24 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
Python求解平方根的方法
2015/03/11 Python
Python编程之string相关操作实例详解
2017/07/22 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
python 如何快速复制序列
2020/09/07 Python
Python descriptor(描述符)的实现
2020/11/15 Python
HTML5 拖放(Drag 和 Drop)详解与实例代码
2017/09/14 HTML / CSS
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
报关简历自我评价怎么写
2013/09/19 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
房屋转让协议书
2014/04/11 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
教师年度考核个人总结
2015/02/12 职场文书
春晚观后感
2015/06/11 职场文书
草房子读书笔记
2015/06/29 职场文书
调解协议书范本
2016/03/21 职场文书