随机时间生成器

在全天或仅工作时段 09:00–18:00 的受限区间内直接均匀取样,加约束不靠「生成全天再过滤」。固定种子可复现,打开就能看到与复算表一致的两组时间。

按回车立即重生成,范围 1~2147483646。
按回车立即重生成,范围 1~20 条。
三种约束都在各自受限区间直接取样,不过滤全天样本。
默认已填工作时段;终点按「不含」处理,裸回车只换行。
当前约束—
区间起点(分)—
区间跨度(分)—
生成条数—
当前种子—

提示:数字框按回车立即重生成;自定义区间按 Ctrl/Cmd + Enter 应用。加约束直接取样,不是全天生成再过滤。

不同种子的两组时间对照(数值由本页脚本实时计算)

种子工作时段首条全天首条工作分钟全天分钟

对照表第一行是基准种子,与完整示例同参数;每组都走同一条线性同余序列,工作时段与全天各取首条。

使用方法

  1. 先选取样约束。默认「仅工作时段 09:00–18:00」,另有「全天 00:00–24:00」与「自定义区间」。三种都从各自的受限区间直接取样,不会先生成全天再筛掉不合格的样本。
  2. 填固定种子与数量。种子默认 20261107,是数值复算表的基准;数量默认 5。两个数字框按回车立即重生成,同一种子、同一约束、同一数量必得同一批时间。
  3. 自定义区间。在文本框按 HH:MM-HH:MM 填写,默认 09:00-18:00,按 Ctrl/Cmd + Enter 应用;裸回车只换行。格式不对或范围不合法会写明原因,不会静默改用默认区间。
  4. 结果区分两块。上半是「基准对照」,固定种子下工作时段与全天两组,与复算表逐条对齐;下半是「当前生成」,按你选的约束、数量、种子实时算出。结果区用 role="alert" 标注,读屏可整段播报。
  5. 核对与导出。对照表默认 12 行、可再展开 2 行,导出 CSV 带 BOM、复制按 TSV 分列。种子或数量留空、填非数字、越界,或自定义区间解析失败,红框写明字段与原因,不会静默归零。

这个工具能解决什么问题

一是给排班、日程与测试用例提供可回放的时间点。做考勤演示、生成会议时段、填充订单时间戳,都需要一批「看起来随机但每次都一样」的时间,把种子写进用例即可精确复现,截图比对和缺陷复现都不会因时间漂移而失败。

二是保证约束下的时间确实落在工作时段内。很多场景只接受 09:00–18:00 之间的时刻,若用「生成全天再过滤」的土办法,命中率只有 37.5%,得写重试循环,还容易把 18:00 的边界算错。本页在 540~1079 分钟区间直接取样,一次命中且边界清晰。

三是教学演示均匀分布与过滤的差别。同一随机流分别按全天与受限区间取样,能直观看到「直接取样」既简单又保持均匀,而过滤会额外消耗随机状态。有些旧目录把本页记作随机时间生成器,用途也限于演示与测试数据;本页不做真实排班决策、不接日历、不判节假日。

原理和变量:均匀分布、受限区间与为什么不能过滤

先把一天离散成分钟。全天是 0~1439 这 1440 个整数分钟,rnd(1440) 得下标 m,再按 floor(m / 60) : m % 60 拆成时与分。每个分钟等概率,这就是均匀分布;24:00 由 1439 表示 23:59,不额外造 1440 这个不存在的分钟。

加约束后在受限区间直接取样。工作时段 09:00–18:00 对应 540~1079 分钟,跨度 540。正确写法是 540 + rnd(540):起点加上区间内的偏移,一次落在 540 到 1079,天然均匀,且 18:00(1080 分)按定义不含入,边界没有歧义。自定义区间同理,先算出起点与跨度,再 起点 + rnd(跨度)。

为什么不是「生成全天再过滤」。第一,命中率低:1440 分钟里只有 540 个合格,平均要生成 1440/540 ≈ 2.67 次才留下 1 个,循环和重试上限都得自己写。第二,也是最关键的,被丢弃的样本一样会推进线性同余状态,同一种子下「有效结果」取决于被过滤掉多少次;换一种约束,序列位置就对不上,固定种子可复现的对照关系被破坏。第三,边界容易错:18:00 算不算、1440 含不含,过滤条件一写偏就多算或少算一分钟。第四,过滤后剩下的点虽在区间内近似均匀,但代码复杂、可能死循环,远不如直接在受限区间取样。

随机流与固定种子。状态转移仍是全站统一的 s = (Math.imul(s, 1103515245) + 12345) 与 0x7fffffff 按位相与,取词 Math.floor(s / 2147483647 * len)。页面不调用 Math.random、不联网取随机源,因此结果完全由种子、约束与数量决定。

基准序列的对齐。完整示例与对照表使用同一条从 20261107 出发的连续序列:前 15 步已分配给虚拟公司示例的词库下标取样,时间取样从第 16 步开始,先 5 次 540 + rnd(540) 得工作时段组,紧接 5 次 rnd(1440) 得全天组,因此与数值复算表逐条一致。这是序列对齐,不是过滤,也不影响均匀性。

变量范围:种子 1~2147483646、数量 1~20、工作时段 540~1079 分、全天 0~1439 分、自定义区间 0~1440 分且起点小于终点。超出都会明确报错。

完整示例(基准种子实测)

基准种子 20261107,先按工作时段直接取样 5 条,再按全天直接取样 5 条:

两组时间不是写死在 HTML 里的,而是页面加载时按同一条 LCG 序列在各自的受限区间直接取样、再格式化成 HH:MM 填入,与数值复算表的 16:41 | 16:00 | 13:15 | 11:15 | 09:12 和 07:12 | 15:22 | 18:58 | 03:32 | 16:56 逐条一致。

注意工作时段组的每一条都在 09:00 到 17:59 之间,全天组才可能出现 03:32、18:58 这类时刻。两组的差异来自取样区间不同,而不是事后把全天样本筛掉一半 —— 后者会消耗额外的随机步数,就对不上复算表了。

对照表与输入范围

表格列出 14 个不同种子,前 12 行直接可见,后 2 行点「加载更多」展开。每个种子都调用同一个 series 函数,走完基准预热步长后,分别取工作时段首条与全天首条,并给出对应的分钟值,因此不是静态速查表。

第一行 20261107 就是基准样本,是整张表的锚点。其余覆盖极小种子、连续种子、年份种子与三十一位上界,方便观察「种子只差 1,两组时间都变」,以及全天首条可能落在凌晨、工作时段首条始终不低于 09:00。

两个按钮从同一份计算结果生成数据:导出 CSV 带 UTF-8 BOM,Excel 打开中文表头不乱码;复制对照表按 TSV 送进剪贴板自动分列,屏幕所见与导出所得永远一致。

结果边界与舍入

常见问题

工作时段为什么是 09:00–18:00?

它对应 540~1079 分钟,跨度 540,是常见的办公时段约定。09:00 含入、18:00 不含入,边界写成 540 + rnd(540) 就没有歧义。

能生成 18:00 吗?

不能。18:00 是 1080 分,按定义终点不含入,最晚一条是 17:59。需要含入终点请把自定义区间填到 18:01 之类的下一分钟。

为什么不用「生成全天再过滤」?

命中率只有 37.5%、要写重试循环,被丢弃的样本还会推进随机状态,让同一种子在不同约束下对不上复算表,边界 18:00 也容易算错。

过滤后剩下的时间还均匀吗?

近似均匀,但代码要写循环与重试上限,随机序列位置还会随丢弃次数漂移。直接在受限区间取样一次命中,既简单又可复现。

换种子结果会变吗?

会,哪怕种子只差 1,两组时间都会换一批;但同一种子、同一约束、同一数量,无论刷新多少次都必得同一批时间。

能自定义别的区间吗?

能。选「自定义区间」按 HH:MM-HH:MM 填写,例如 13:00-15:30,页面会在你的起点与跨度内直接取样,不过滤全天样本。

结果是严格均匀吗?

用 31 位状态映射到区间近似均匀,线性同余低位存在相关性,属于演示与测试数据级别,不能当密码学随机源用。

会联网或上传吗?

不会。取样与格式化全在当前浏览器完成,页面不发起网络请求,也不写 Cookie 或 localStorage,Network 面板始终是空的。

相关工具