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 相关文章推荐
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
Dec 11 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
May 13 Javascript
jquery实现图片裁剪思路及实现
Aug 16 Javascript
纯js简单日历实现代码
Oct 05 Javascript
通过隐藏iframe实现文件下载的js方法介绍
Feb 26 Javascript
jquery实现搜索框常见效果的方法
Jan 22 Javascript
浅析JavaScript中的array数组类型系统
Jul 18 Javascript
AngularJS表单详解及示例代码
Aug 17 Javascript
js字符串引用的两种方式(必看)
Sep 18 Javascript
Select2.js下拉框使用小结
Oct 24 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
Aug 10 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 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
PHP中常用的输出函数总结
2014/09/22 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python实现发送email的几种常用方法
2014/08/18 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
Python使用OpenCV进行标定
2018/05/08 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
python找出因数与质因数的方法
2019/07/25 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
python 模拟登陆163邮箱
2020/12/15 Python
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
批评与自我批评材料
2014/02/15 职场文书
大学毕业感言200字
2014/03/09 职场文书
周年庆促销方案
2014/03/15 职场文书
《老山界》教学反思
2014/04/08 职场文书
家长建议怎么写
2014/05/15 职场文书
新生入学欢迎词
2015/01/26 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL