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

如何用JavaScript基于当前日期生成每日唯一的指定范围随机数

基于日期生成每日固定的1-87随机数

核心思路是用当日日期作为伪随机数生成器的种子,这样只要是同一天,种子一致,生成的结果就固定,完全不依赖Cookie或localStorage,清空缓存也不受影响。

下面是完整实现:

步骤1:获取当日日期种子

先把当前日期转成YYYYMMDD格式的字符串,比如今天是2024年5月20日,就得到"20240520",这个字符串可以直接作为种子源。

步骤2:实现种子式伪随机数生成器

这里用轻量可靠的Mulberry32算法,它能基于固定种子输出稳定的伪随机序列:

function mulberry32(seed) {
  return function() {
    seed += 0x6D2B79F5;
    let t = seed;
    t = Math.imul(t ^ t >>> 15, t | 1);
    t ^= t + Math.imul(t ^ t >>> 7, t | 61);
    return ((t ^ t >>> 14) >>> 0) / 4294967296;
  }
}

步骤3:结合日期生成目标数值

把日期转成种子,初始化随机函数,再把结果映射到1-87的范围:

// 获取当日YYYYMMDD格式的种子
function getDailySeed() {
  const date = new Date();
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,要+1补前导零
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}${month}${day}`;
}

// 生成当日固定的1-87数值
function getDailyNumber() {
  const seedStr = getDailySeed();
  // 把字符串转成数值种子,这里用parseInt直接转,也可以用哈希算法增强唯一性
  const seed = parseInt(seedStr, 10);
  const random = mulberry32(seed);
  // 生成0到86的整数,再加1得到1-87
  return Math.floor(random() * 87) + 1;
}

// 测试调用
console.log(getDailyNumber()); // 当日内多次调用结果一致,次日自动变化

补充说明

  • 为什么不用Math.random()?因为它的种子是系统随机的,每次刷新都变,而我们需要固定种子的伪随机。
  • 如果担心YYYYMMDD转数值的种子不够“随机”,可以给字符串做个简单哈希,比如:
function hashString(str) {
  let hash = 0;
  for (let i = 0; i < str.length; i++) {
    hash = ((hash << 5) - hash) + str.charCodeAt(i);
    hash |= 0; // 转成32位整数
  }
  return hash;
}
// 然后在getDailyNumber里用hashString(seedStr)代替parseInt(seedStr,10)

这样不管用户怎么清缓存,只要是同一天,调用getDailyNumber()都会得到同一个1-87之间的数,次日自动更新。

内容的提问来源于stack exchange,提问作者GlowJr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:55:23