JavaScript初学者求助:解释数组随机打乱代码的运行逻辑
代码运行逻辑讲解
这段是经典的Fisher-Yates 洗牌算法,作用是公平随机打乱数组的元素顺序,核心逻辑分三部分:
1. 初始定义
首先声明了一个常量数组points,初始值为[40, 100, 1, 5, 25, 10],数组长度为6,元素索引范围是0~5。
2. 倒序遍历交换
外层是倒序执行的for循环:
- 循环变量
i初始值为points.length - 1也就是5,对应数组最后一个元素的索引,循环执行条件为i > 0,每次循环结束后i递减1 - 循环内部第一行
let j = Math.floor(Math.random() * i):生成一个取值范围在[0, i-1]的随机整数,作为本次交换的随机索引 - 后续三行是标准的变量交换逻辑:用临时变量
k暂存当前索引i的元素值,再把随机索引j的元素赋值给points[i],最后把临时变量k里存的原i位置元素赋值给points[j],完成两个位置元素的互换
3. 结果输出
循环执行完毕后,console.log(points)会打印出完全打乱后的数组内容。
补充说明
这个算法的核心优势:
- 时间复杂度为O(n),仅需要遍历数组一次
- 空间复杂度为O(1),不需要额外开辟空间存储新数组
- 倒序遍历+从前i个元素取随机索引的设计,能保证每个元素出现在任意位置的概率完全相等,不会出现洗牌偏倚的问题
内容的提问来源于stack exchange,提问作者MOHAMMAD Ali
相关产品推荐
相关产品推荐

