生成含1-9不重复随机数的9个div,如何对比新旧z变量?
解决1-9不重复随机数生成问题
你的代码存在几个问题:
- 随机数范围错误:
Math.floor(Math.random()*10)会生成0-9的整数,不符合你需要的1-9范围 - 无去重逻辑:生成的数字大概率会重复
- JS代码有语法错误:
for循环后多了一个多余的闭合大括号,导致函数结构异常 - HTML标签错误:
<b2>不是有效标签,建议改成<h2>(标题)或<b>(加粗)
推荐解决方案:洗牌算法(高效简洁)
先创建1-9的有序数组,再用经典的Fisher-Yates洗牌算法打乱顺序,最后遍历数组生成div。这种方式无需重复生成随机数做检查,逻辑清晰且性能更优。
修复后的JavaScript代码:
var play_box = document.getElementById('play_ground'); function myFunction(){ // 生成1-9的数组 const numbers = Array.from({ length: 9 }, (_, index) => index + 1); // Fisher-Yates洗牌算法打乱数组 for (let i = numbers.length - 1; i > 0; i--) { const randomIndex = Math.floor(Math.random() * (i + 1)); // 交换位置 [numbers[i], numbers[randomIndex]] = [numbers[randomIndex], numbers[i]]; } // 遍历数组生成div元素 numbers.forEach(num => { play_box.innerHTML += '<div class="box">' + num + '</div>'; }); }
备选方案:生成随机数后去重(不推荐,效率较低)
如果一定要用“生成随机数后对比已用数字”的逻辑,可以维护一个已使用数字的数组,每次生成随机数后检查是否重复,不重复则添加到页面和数组中:
var play_box = document.getElementById('play_ground'); function myFunction(){ const usedNumbers = []; // 直到凑够9个不重复数字 while (usedNumbers.length < 9) { // 生成1-9的随机数 const z = Math.floor(Math.random() * 9) + 1; if (!usedNumbers.includes(z)) { usedNumbers.push(z); play_box.innerHTML += '<div class="box">' + z + '</div>'; } } }
修正后的HTML(可选)
把无效的<b2>标签修正:
<html> <head> <link rel="stylesheet" href="style.css"> </head> <body onload="myFunction()" id="body"> <div id='play_ground'> </div> <h2>PLAY</h2> <script src="Game-9.js"></script> </body> </html>
内容的提问来源于stack exchange,提问作者Tigran Hakobyan
相关产品推荐
相关产品推荐

