如何用JavaScript生成满足指定和规则的1-9不重复数字序列?
代码问题修复与优化方案
现有代码的BUG点
- 重置逻辑运算符错误:你当前的重置判断用了
&&逻辑与,含义是「三个条件全部不满足才重置数组」,实际需求是「只要有一个条件不满足就需要重置」,把&&替换为||即可解决重复返回、页面无响应的问题 - 暴力随机生成效率极低:1-9的全排列共有362880种,符合你要求的排列占比极低,随机碰撞的方式本身就容易出现长时间加载的情况
修复后的暴力随机版代码
var xyz = []; var arrays = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var xy = arrays.length; setInterval(function() { // 生成无重复的1-9随机数组 while (xy > 0) { var x = Math.floor(Math.random() * xy); xyz.push(arrays[x]); arrays.splice(x, 1); xy = xy - 1; } // 任意条件不满足就重置 if (xyz[0] + xyz[1] + xyz[2] !== 15 || xyz[1] + xyz[4] + xyz[7] !== 15 || xyz[2] + xyz[5] + xyz[8] !== 15) { xyz.length = 0; arrays = [1, 2, 3, 4, 5, 6, 7, 8, 9]; xy = arrays.length; } else { alert('it works!!!'); console.log(xyz); } }, 100);
更高效的实现方案(无随机碰撞,100%命中)
你要实现的本质是三阶幻方(九宫格),满足要求的合法排列一共只有8种(基础幻方的4次旋转+4次镜像),直接预存所有合法排列再随机抽取即可,完全不会出现卡顿:
// 预存所有符合要求的三阶幻方排列 const validGrids = [ [8,1,6,3,5,7,4,9,2], [6,1,8,7,5,3,2,9,4], [4,9,2,3,5,7,8,1,6], [2,9,4,7,5,3,6,1,8], [8,3,4,1,5,9,6,7,2], [4,3,8,9,5,1,2,7,6], [6,7,2,1,5,9,8,3,4], [2,7,6,9,5,1,4,3,8] ]; // 随机取一个合法排列 const xyz = validGrids[Math.floor(Math.random() * validGrids.length)]; console.log(xyz); alert('生成成功');
该方案的运算效率是暴力随机版的数万倍,不会出现任何加载无响应的问题。
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

