使用方法
- 先选取样约束。默认「仅工作时段 09:00–18:00」,另有「全天 00:00–24:00」与「自定义区间」。三种都从各自的受限区间直接取样,不会先生成全天再筛掉不合格的样本。
- 填固定种子与数量。种子默认 20261107,是数值复算表的基准;数量默认 5。两个数字框按回车立即重生成,同一种子、同一约束、同一数量必得同一批时间。
- 自定义区间。在文本框按 HH:MM-HH:MM 填写,默认 09:00-18:00,按 Ctrl/Cmd + Enter 应用;裸回车只换行。格式不对或范围不合法会写明原因,不会静默改用默认区间。
- 结果区分两块。上半是「基准对照」,固定种子下工作时段与全天两组,与复算表逐条对齐;下半是「当前生成」,按你选的约束、数量、种子实时算出。结果区用 role="alert" 标注,读屏可整段播报。
- 核对与导出。对照表默认 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 条:
- 仅工作时段 09:00–18:00:;
- 全天 00:00–24:00:;
- 工作时段起点 分(09:00),跨度 分。
两组时间不是写死在 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。
- 固定种子:1~2147483646,步长 1,即 31 位正整数范围。
- 生成数量:1~20 条,步长 1,每次取样消耗一步状态。
- 内置约束:工作时段起点 540、跨度 540;全天起点 0、跨度 1440。
- 自定义区间:HH:MM-HH:MM,终点按「不含」处理,跨度必须大于 0 且终点不超过 1440 分。
两个按钮从同一份计算结果生成数据:导出 CSV 带 UTF-8 BOM,Excel 打开中文表头不乱码;复制对照表按 TSV 送进剪贴板自动分列,屏幕所见与导出所得永远一致。
结果边界与舍入
- 分钟是整数,没有小数舍入。用
floor(m / 60)与m % 60直接拆成两位补零的时与分,03:32 不会写成 3:32,也不会把 13.6363 这类值四舍五入。 - 边界定义明确。全天 0~1439 含 1439(23:59)、不含 1440;工作时段 540~1079 含 540(09:00)与 1079(17:59),不含 1080(18:00),自定义区间终点同样按不含处理。
- 预热步长是序列对齐,不是过滤。15 步来自全站复算表的统一基准,换约束也不跳过,保证与复算表逐条可对照;它不消耗有效样本,也不改变区间内的均匀性。
- 自定义区间解析严格。格式必须为 HH:MM-HH:MM,分钟部分 00~59,起点小于终点、终点不超过 1440,否则写明是格式错还是范围错并中止计算。
- 非法输入不静默归零。种子或数量留空、填字母、超范围都会写明字段与允许区间;整条链路是整数乘法、按位相与、区间映射与补零拼接,纯本地执行,无网络请求,也不写 Cookie 或 localStorage。
常见问题
工作时段为什么是 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 面板始终是空的。