zoukankan      html  css  js  c++  java
  • 数组的随机排序(含洗牌算法)

    我们需要将一个数组内的元素顺序进行打乱,达到随机排序的目的。首先想到的是 Math.random() 方法结合数组的 sort() 方法。

    Math.random() 结合 sort() 方法

    Math.random() 方法用于产生一个介于 0 和 1 之间的随机数(含 0 但不包括 1)。

    数组的 sort() 方法可以有两种用法:

    用法一:在不传入可选的函数参数时,将会对数组的每一个元素应用 toString() 方法,通过比较字符串大小的方式升序排列所有的数组项。

    用法二:编写比较函数并作为参数传入,假设有以下比较函数(补充一点关于下面参数 a、b 的说明,若 a 为数组的第一个元素,则 b 为第二个元素,依次类推……),

    function compare (a, b) {
      // 省略一些代码……
      return val;
    }
    

    如果你想将 a 变量排列在变量 b 的前面位置,则比较函数返回负数(即上述 val 为负数);若想将 a 变量排列在变量 b 的后面,则返回正数(即上述 val 为正数);若不需要改变 a、b 变量之间的顺序,则返回 0(即上述 val 为 0)。

    因此有了以下代码:

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    arr.sort(function (a, b) {
      return Math.random() - 0.5;
    });
    console.log(arr);
    

    洗牌算法

    上述方法比较简单,且代码量少,短小精悍。这里我再讲一种比上面复杂一些的洗牌算法,通过它也能达到数组随机排序的效果。那下面就开讲啦~

    首先是要明白它的洗牌原理,该算法需要遍历整个数组,当遍历到第 i(i 为数组元素的索引)个元素时,从 0 到 i 随机挑选出一个数字,记为 index,然后对索引为 i 和 index 的数组元素进行互换,直至遍历结束。如此下来,也即完成了数组的随机排序。来看下代码吧:

    var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    function shuffle (arr) {
      var len = arr.length;
      for (var i = 0; i < len; i++) {
        // 生成 0 到 i 之间的随机整数
        var index = Math.floor(Math.random() * (i + 1));
        // 使用 ES6 中的解构赋值完成两个变量值的交换
        [arr[i], arr[index]] = [arr[index], arr[i]];
      }
      return arr;
    }
    console.log('Shuffled arr: ', shuffle(arr));
    

    以上就是我目前想到的两种方法,在这里分享给大家,若有不足之处,请予以指出,感谢!



    转载:小珥_Boy



  • 相关阅读:
    Linux网络连接图标不见了
    使用fiddler4实现手机抓包的相关配置
    selenium之 时间日期控件的处理
    vue 上传文件示例
    从入门到自闭之Python解释器安装
    从入门到自闭--并发编程
    Python高阶操作--关于数据清洗
    Python高阶操作--数据分析的理解
    python --数据库、网络编程
    python基础
  • 原文地址:https://www.cnblogs.com/AlbertP/p/10727843.html
Copyright © 2011-2022 走看看