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 相关文章推荐
excel操作之Add Data to a Spreadsheet Cell
Jun 12 Javascript
分享几个超级震憾的图片特效
Jan 08 Javascript
原生JS实现加入收藏夹的代码
Oct 24 Javascript
JavaScript常用的弹出广告及背投广告实现方法
Feb 06 Javascript
vue.js入门教程之绑定class和style样式
Sep 02 Javascript
js实现图片切换(动画版)
Dec 25 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
Aug 12 Javascript
JS实现点击拉拽轮播图pc端移动端适配
Sep 05 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
Mar 07 Javascript
JavaScript中Dom操作实例详解
Jul 08 Javascript
防止Layui form表单重复提交的实现方法
Sep 10 Javascript
JS实现网页时钟特效
Mar 25 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
DedeCms模板安装/制作概述
2007/03/11 PHP
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
php网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
Javascript - HTML的request类
2006/07/15 Javascript
15 个 JavaScript Web UI 库
2010/05/19 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
如何编写高质量JS代码
2014/12/28 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
javascript常用的设计模式
2017/02/09 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
2017/04/17 jQuery
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
小程序hover-class点击态效果实现
2019/02/26 Javascript
Python中scatter函数参数及用法详解
2017/11/08 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
python实现五子棋游戏(pygame版)
2020/01/19 Python
python模拟实现分发扑克牌
2020/04/22 Python
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
“学雷锋活动月”总结
2014/03/09 职场文书
《花木兰》教学反思
2014/04/09 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
师德师风事迹材料
2014/12/20 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
父亲节寄语大全
2015/02/27 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
自考生自我评价
2019/06/21 职场文书
排查MySQL生产环境索引没有效果
2022/04/11 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL