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

 更新时间:2015年08月10日 11:48:14   作者:__fon123__  
这篇文章主要介绍了javascript实现数组内值索引随机化及创建随机数组的方法,涉及javascript数组索引及随机数的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了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程序设计有所帮助。

相关文章

  • Layui表格行内动态编辑数据

    Layui表格行内动态编辑数据

    本文主要介绍经典前端框架 layui 中的动态表格数据操作,结合 JQuery 动态编辑单元格中的数据,具有一定的参考价值,感兴趣的可以了解一下
    2021-08-08
  • Spring mvc 接收json对象

    Spring mvc 接收json对象

    这篇文章主要介绍了Spring mvc 接收json数据的相关资料,需要的朋友可以参考下
    2015-12-12
  • JavaScript中判断函数、变量是否存在

    JavaScript中判断函数、变量是否存在

    这篇文章主要介绍了JavaScript中判断函数、变量是否存在,本文给出了多个判断函数是否存在的方法,并分别给出代码实例,需要的朋友可以参考下
    2015-06-06
  • 微信小程序实现验证码倒计时效果

    微信小程序实现验证码倒计时效果

    这篇文章主要介绍了微信小程序实现验证码倒计时效果,手机登录、填手机号获取验证码,倒计时后重新获取效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 使用javascript实现有效时间的控制,并显示将要过期的时间

    使用javascript实现有效时间的控制,并显示将要过期的时间

    本篇文章主要介绍了使用javascript实现有效时间的控制,并显示将要过期的时间示例代码。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • js如何获取对象在数组中的index

    js如何获取对象在数组中的index

    这篇文章主要介绍了js如何获取对象在数组中的index,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • javascript线性渐变一

    javascript线性渐变一

    javascript在处理图像的能力其实是不弱的,可惜浏览器大战连累了它,这还不算,Adobe 收购Macromedia更让SVG处于怠工状态。
    2009-10-10
  • js文件中直接alert()中文出来的是乱码的解决方法

    js文件中直接alert()中文出来的是乱码的解决方法

    下面小编就为大家带来一篇js文件中直接alert()中文出来的是乱码的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 移动端效果之IndexList详解

    移动端效果之IndexList详解

    这篇文章主要为大家详细介绍了移动端效果之IndexList,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • js截取函数(indexOf,join等)

    js截取函数(indexOf,join等)

    下面是js中截取字符串经常会用到的一些函数,这里每个函数都给出了例子,学习的朋友可以参考下。
    2010-09-09

最新评论