You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:45:06