如何用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
相关产品推荐
相关产品推荐

