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

本文介绍了两种在JavaScript中实现数组随机打乱的方法,这两种方法都是原地操作且时间复杂度为O(n)。方法一是通过随机选择未处理的元素与尾部元素交换;方法二是利用无符号右移位运算符进行随机选取。两种方法在效率上接近,提供了不同的实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个数组 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;
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值