JavaScript随机数存储与去重求助:每周生成不重复数并展示
问题分析与解决方案
原代码核心问题
你的代码逻辑存在明显错误:
- 循环条件
i < getRndId()每次都会生成新的随机数,导致循环次数完全随机 - 循环内每次调用
getRndId()都会生成新值,数组会被塞入多个随机数,完全不符合「每周存一个」的需求
需求实现思路
要完成「每周生成唯一不重复随机数、持久存储、展示历史记录」,需要做到:
- 用
localStorage持久化数据,避免页面刷新后丢失记录 - 每次加载页面时判断是否进入新一周,是则生成新的不重复随机数,否则沿用本周已生成的数
- 修复随机数生成函数的语法冗余(原代码里的
(0, 5554)是逗号运算符,实际等价于5554)
修改后的完整代码
// 生成0到5553的随机整数 function getRndId() { return Math.floor(Math.random() * 5554); } // 获取本地存储的已选数据,无数据则初始化 function getStoredData() { const stored = localStorage.getItem('weeklyRandomNumbers'); return stored ? JSON.parse(stored) : { pickedNumbers: [], lastWeekTimestamp: null }; } // 判断两个时间是否在同一周(以周一为一周起始,可按需调整) function isSameWeek(timestamp1, timestamp2) { const date1 = new Date(timestamp1); const date2 = new Date(timestamp2); // 计算当年的周数 const getWeekNumber = (date) => { const startOfYear = new Date(date.getFullYear(), 0, 1); const days = Math.floor((date - startOfYear) / (24 * 60 * 60 * 1000)); return Math.ceil((days + startOfYear.getDay() + 1) / 7); }; return date1.getFullYear() === date2.getFullYear() && getWeekNumber(date1) === getWeekNumber(date2); } // 主逻辑 const data = getStoredData(); const now = Date.now(); let currentWeekNumber; // 检查是否需要生成新随机数 if (!data.lastWeekTimestamp || !isSameWeek(data.lastWeekTimestamp, now)) { // 生成不重复的随机数 do { currentWeekNumber = getRndId(); } while (data.pickedNumbers.includes(currentWeekNumber)); // 更新存储数据 data.pickedNumbers.push(currentWeekNumber); data.lastWeekTimestamp = now; localStorage.setItem('weeklyRandomNumbers', JSON.stringify(data)); } else { // 沿用本周已生成的数(取数组最后一项) currentWeekNumber = data.pickedNumbers[data.pickedNumbers.length - 1]; } // 页面展示 document.getElementById("random_number").innerHTML = `本周选中数:${currentWeekNumber}`; document.getElementById("Picked_numbers").innerHTML = `历史选中数:${data.pickedNumbers.join(', ')}`;
代码说明
localStorage实现数据持久化,关闭页面后记录不会丢失isSameWeek函数可根据需求调整一周的起始日(比如改成周日)- 用
do-while循环确保新生成的数不会和历史重复 - 分区域展示本周选中数和所有历史选中数
内容的提问来源于stack exchange,提问作者Kris Can
相关产品推荐
相关产品推荐

