js 生成随机数(洗牌算法)

1,020 阅读1分钟

给定一个数组 nums ,随机打乱成一个没有重复元素的数组。

方法一

每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度为 O(n)

  1. 选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换,此时最后一个元素已经确定
  2. 选取倒数第二个元素(arr[length-2]),将其与n-1个元素中的任意一个交换
  3. 重复第 1 2 步,直到剩下1个元素为止
	function shuffle(arr) {
      let length = arr.length;
      let random = 0
      while (0 != length) {
        random = Math.floor(Math.random() * length)
        length--;
        [arr[length], arr[random]] = [arr[random], arr[length]]
      }
      return arr;
    }
方法二

思路不变,利用无符号右移位运算符向下取整方式

	function shuffle(arr){
      let length = arr.length
      let random = 0;
      while(0!=length){
          random =  (Math.random() * length--) >>> 0;
          [arr[length], arr[random]] = [arr[random], arr[length]]
      }
      return arr;
    }

从效率上对比方法一要稍微快一些