javascript实现数组内值索引随机化及创建随机数组的方法


Posted in Javascript onAugust 10, 2015

本文实例讲述了javascript实现数组内值索引随机化及创建随机数组的方法。分享给大家供大家参考。具体如下:

今天在QW交流群里看到有同学讨论使数组随机化的问题,其中给出的算法很不错,让我想起了之前自己实现过的不怎么“漂亮”的方法。想想我们有时候在繁忙的写业务代码时只是为了实现其功能,并未花太大心思去思考是否有更好的实现方法。

就这个数组问题(随即排序一个数组里的值,返回一个新数组)来说,我以前的实现方法是这样的:

function randArr(arr) {
 var ret = [],
 obj = {},
 i = arr.length,
 l = i,
 n;
 while (--i >= 0) {
  n = Math.floor( Math.random() * l );
  if (obj[n] === void 0) {
   ret[ret.length] = obj[n] = arr[n];
  } else {
   i++;
  }
 }
 return ret;
}

上面的代码会工作,但并不是一个好的算法,它打算执行“原数组的长度”次循环,每一次循环会随机取一个原数组中的索引,然后判断该索引是否已被取过,如果没有则把该索引的值放入新数组中,如果取过则把自减键 i 自增1(目的是重复该次循环直到取到另一个未取过的索引)。这样的方法的性能是很看人品的,原因相信看到这种思路的同学都已明白了。

现在给出群里那位同学的算法:

function randArr(arr) {
 var ret = [],
 i = arr.length,
 n;
 arr = arr.slice(0);
 while (--i >= 0) {
  n = Math.floor( Math.random() * i);
  ret[ret.length] = arr.splice(n, 1)[0];
 }
 return ret;
}

这是一个相当巧妙的算法,在每次循环中取一个随机的索引后,并把它的值从数组中删除,这样,如果后面依然随机取到这个索引,这个索引就已经不再是上一次取到的值了,而且随机数的取值范围会根据数组的长度的减小而减小,这样就能一次性循环一定的次数而得到理想的结果。

还看到了一个改进版的,是考虑到了对数组的删除操作而导致的些许性能问题,运用了JK大的洗牌算法,即把每一次删除操作改为了位置替换操作(取到的该索引的值和当前自减键 i 对应的值进行互换),这样对整个数组的影响是最小的,还是放代码吧:

function randArr(arr) {
 var ret = [],
 i = arr.length,
 n;
 arr = arr.slice(0);
 
 while (--i >= 0) {
  n = Math.floor( Math.random() * i);
  ret[ret.length] = arr[n];
  arr[n] = arr[i];
 }
 return ret;
}

最后给出一个“创建值为min~max间的随机数组”的方法,算法原理同上面的差不多:

function makeRandArr(min, max) {
 var ret = [],
 obj = {},
 n;
 for (; max >= min; max--) {
  n = Math.ceil( Math.random() * (max - min) ) + min;
  ret[ret.length] = obj[n] || n;
  obj[n] = obj[max] || max;
 }
 return ret;
}

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
IE与Firefox下javascript getyear年份的兼容性写法
Dec 20 Javascript
一些常用的JS功能函数(2009-06-04更新)
Jun 04 Javascript
js操作ajax返回的json的注意问题!
Feb 23 Javascript
给应用部分的js代码设定一个统一的入口
Jun 15 Javascript
JavaScript实现按Ctrl键打开新页面
Sep 04 Javascript
javascript中函数作为参数调用的方法
Feb 09 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
Sep 01 Javascript
vue 使用html2canvas将DOM转化为图片的方法
Sep 11 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
Jun 10 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
Mar 10 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
Apr 15 Javascript
详解Vue Cli浏览器兼容性实践
Jun 08 Javascript
jQuery解决input超多的表单提交
Aug 10 #Javascript
jQuery实现的图文高亮滚动切换特效实例
Aug 10 #Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
Aug 10 #Javascript
javascript中caller和callee详解
Aug 10 #Javascript
jQuery实现购物车表单自动结算效果实例
Aug 10 #Javascript
javascript中$(function() {});写与不写有哪些区别
Aug 10 #Javascript
jQuery中$(function() {});问题详解
Aug 10 #Javascript
You might like
我的论坛源代码(一)
2006/10/09 PHP
《PHP边学边教》(01.开篇――准备工作)
2006/12/13 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
JS实现的视频弹幕效果示例
2018/08/17 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python Requests 基础入门
2016/04/07 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
python实现树形打印目录结构
2018/03/29 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
八项规定整改措施
2014/02/12 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
2014年度工作总结报告
2014/12/15 职场文书
Python中的tkinter库简单案例详解
2022/01/22 Python