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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:50:22