如何随机输出数组中所有元素两两比较的结果?
如何随机输出数组元素的两两组合结果?
你已经通过嵌套for循环实现了有序的两两组合输出,原代码和输出如下:
原实现代码:
a = [1, 2, 3, 4, 5]; for(let i = 0; i < a.length; i++) { for(let k = i + 1; k < a.length; k++) { console.log(a[i] + ' -> ' + a[k]); } }
原有序输出:
1 -> 2 1 -> 3 1 -> 4 1 -> 5 2 -> 3 2 -> 4 2 -> 5 3 -> 4 3 -> 5 4 -> 5
要实现随机输出这些两两组合,咱们可以分两步走:先把所有组合存起来,再用公平的洗牌算法打乱顺序,最后输出。具体实现如下:
1. 生成所有两两组合并存储
首先把所有符合要求的两两组合存入一个数组,这样后续可以统一处理顺序:
const a = [1, 2, 3, 4, 5]; const pairs = []; // 遍历生成所有i < k的两两组合 for(let i = 0; i < a.length; i++) { for(let k = i + 1; k < a.length; k++) { pairs.push(`${a[i]} -> ${a[k]}`); } }
2. 用Fisher-Yates洗牌算法打乱数组
这里推荐使用Fisher-Yates洗牌算法,它能保证每个元素被打乱到任意位置的概率相等,是最公平的洗牌方式(比直接用sort(() => Math.random() - 0.5)随机性更均匀):
// 定义洗牌函数 function shuffleArray(array) { // 从后往前遍历数组,逐个交换元素位置 for (let i = array.length - 1; i > 0; i--) { // 生成0到i之间的随机索引 const j = Math.floor(Math.random() * (i + 1)); // 交换当前元素和随机索引的元素 [array[i], array[j]] = [array[j], array[i]]; } return array; } // 打乱组合数组 const shuffledPairs = shuffleArray(pairs);
3. 输出随机顺序的组合
最后遍历打乱后的数组,就能得到随机的输出结果了:
shuffledPairs.forEach(pair => console.log(pair));
示例随机输出:
2 -> 5 1 -> 2 3 -> 4 1 -> 5 2 -> 3 3 -> 5 1 -> 3 2 -> 4 1 -> 4 4 -> 5
每次运行代码,输出的顺序都会不一样,但所有组合都会完整出现一次,完全符合你的需求~
内容的提问来源于stack exchange,提问作者PrettyBiased
相关产品推荐
相关产品推荐

