React Native自定义Array.shuffle方法实现无重复随机数组求助
数组shuffle方法实现问题修复
原代码存在的问题
- 仅生成了范围为原数组长度的随机索引值,没有对应提取原数组的元素,输出结果不是原数组的内容
- 没有做重复值校验,生成的随机索引大概率会出现重复,不符合无重复的要求
正确实现(Fisher-Yates 洗牌算法,业界通用无偏洗牌方案)
export default function App() { Array.prototype.shuffle = function () { // 拷贝原数组避免修改原数组,减少副作用 const arr = [...this] for (let i = arr.length - 1; i > 0; i--) { // 生成0到i区间的随机索引 const randomIdx = Math.floor(Math.random() * (i + 1)); // 交换当前位置元素和随机索引位置的元素 [arr[i], arr[randomIdx]] = [arr[randomIdx], arr[i]] } console.log(arr) // 返回打乱后的数组供外部逻辑使用 return arr } let random = [0,1,2,3,4].shuffle() }
实现说明
注意:直接在Array.prototype上扩展方法属于污染全局原型链,非特殊场景不推荐这种写法,可以封装为独立工具函数使用
- 从数组末尾开始遍历,每次取当前位置之前的随机索引和当前位置元素交换,保证每个元素出现在任意位置的概率均等
- 最终输出的数组包含原数组所有元素,无重复,且顺序完全随机
内容的提问来源于stack exchange,提问作者Sebastian Pehrson
相关产品推荐
相关产品推荐

