点击按钮时直接生成唯一不重复随机数的实现问题咨询
解决一次性生成不重复随机数的问题
我来帮你搞定这个问题!你想要的是每次点击按钮就能直接拿到一个没选过的1-75之间的数字,不用反复点击对吧?咱们先看看你原代码里的问题:
你的while循环条件写反啦!原代码里while(selectedNumbers.indexOf(r) === -1)的意思是——当这个随机数不在列表里的时候,才把它加进去。但如果第一次生成的数字已经在列表里了,这个循环根本不会执行,自然也不会重新生成新数字,所以你得重复点击才行。
修正方案一:调整循环逻辑(基于数组)
我们要改成:只要生成的数字已经在列表里,就重新生成,直到找到没出现过的,再把它加进去。同时还要加个边界判断,避免所有数字都选完后进入死循环:
// 初始化已选数字数组 let selectedNumbers = []; const chooseNumber = () => { // 先检查是否所有1-75的数字都被选完了 if (selectedNumbers.length >= 75) { console.log("所有数字都已被选中,无法生成新数字啦!"); return; } let r; // 用do-while先生成一次数字,再判断是否重复 do { r = Math.floor(Math.random() * 75) + 1; } while (selectedNumbers.indexOf(r) !== -1); // 确认是未选中的数字后,添加到数组 selectedNumbers.push(r); console.log("新选中的数字:", r); console.log("已选中的所有数字:", selectedNumbers); };
这里用do-while而不是普通while的原因是:它会先执行一次随机数生成,再判断是否重复,确保我们至少有一个初始的随机数可以检查,避免变量未定义的问题。
优化方案:用Set提升性能(推荐)
如果你的数字范围很大(比如超过100个),数组的indexOf方法每次查找都要遍历整个数组,性能会变慢。这时候用Set来存储已选数字更合适,因为Set.has()方法的查找速度是O(1)的:
// 用Set存储已选数字,查找更快 let selectedNumbers = new Set(); const chooseNumber = () => { if (selectedNumbers.size >= 75) { console.log("所有数字都已被选中,无法生成新数字啦!"); return; } let r; do { r = Math.floor(Math.random() * 75) + 1; } while (selectedNumbers.has(r)); selectedNumbers.add(r); console.log("新选中的数字:", r); // 如果需要转换成数组格式,用Array.from() console.log("已选中的所有数字:", Array.from(selectedNumbers)); };
这样修改后,每次点击按钮都会直接生成一个从未出现过的数字,再也不用重复点击啦!
内容的提问来源于stack exchange,提问作者breking bed
相关产品推荐
相关产品推荐

