使用方法
- 先填固定种子。默认 20261107,这是数值复算表使用的基准种子。种子决定整条随机序列,改一位数字,整批结果就会换成另一组;同一种子无论刷新多少次都保持不变。
- 再填数量与字号。生成数量默认 5,字号默认「云启」。字号是常量,不参与随机;随机只落在地区、行业、组织形式三个词库的下标上,所以改字号只会换掉中间那截文字。
- 三种触发方式。两个数字框按回车立即重生成;字号框按 Ctrl/Cmd + Enter 应用新字号,裸回车只换行;输出格式用下拉框切换,只影响展示,不改变序列。
- 读结果看重复。结果区用 role="alert" 标注,逐条列出公司名并报「不重复名称数」;五张卡片对应条数、去重数、两个词库长度与当前种子,方便一眼看出有没有撞名。
- 核对与导出。对照表默认 12 行、可再展开 2 行,导出 CSV 带 BOM、复制按 TSV 分列。种子留空、填非数字、超出范围,或字号被清空,红框会写明具体原因,不会静默拿 0 或默认种子顶替。
这个工具能解决什么问题
一是给测试用例提供可回放的假数据。写单元测试、填充演示数据库、做截图回归时,最怕「每次跑数据都不一样」导致断言失败或截图比对全是差异。把种子写进用例,同一种子必得同一批公司名,问题可以精确复现,缺陷单里附上种子就够了。
二是给界面原型补一批像样的占位名称。表格、卡片、下拉列表需要几十条公司名做排版预览,手编既慢又容易重名;本页一次生成,长度与结构统一,看起来像真实名录但完全虚构,不会误用真实企业信息。
三是教学演示「随机」与「可复现」的区别。同一段代码换个种子就换一批结果,学生能直观看到随机序列由种子唯一决定,而不需要任何外部随机源。有些目录把它标成虚拟公司生成器,用途也限于此:生成结果绝不能用于工商注册、合同、发票、开户或任何需要真实法人主体的场景。
原理和变量:固定种子、词库下标与可复现
名称由四段拼成。公司名 = 地区 + 字号 + 行业 + 组织形式。例如北京(地区)、云启(字号)、文化(行业)、有限公司(组织形式)拼成「北京云启文化有限公司」。地区词库 5 个、行业词库 5 个、组织形式词库 3 个;字号由使用者给定,是常量,不进随机流程。
随机只在词库下标上做。生成一条名称要依次取 3 次随机数,分别落到 5、5、3 三个词库的下标上,取词规则是 Math.floor(s / 2147483647 * len),把 31 位状态映射到 0 到 len-1。字号这一段完全不抽随机数,改字号只换中间那截文字,整批结果的地区、行业、组织形式顺序保持不变 —— 这正是「同一种子可对照」的原因,也是本页与「所有字段都随机」的普通名字生成器的根本区别。
状态转移是线性同余算法。递推式为 s = (Math.imul(s, 1103515245) + 12345) 与 0x7fffffff 按位相与:Math.imul 做 32 位整数乘法,加常数后把状态限制在 31 位正整数内。这是经典的 LCG,下一状态只由上一状态和固定常数决定,没有任何外部熵;页面不调用 Math.random,也不联网取随机源,因此结果完全由种子决定。
固定种子保证可复现。因为状态转移是纯函数,给定种子、数量、字号,输出序列唯一确定。把 20261107 写进测试断言,今天、明天、换台机器跑都是同一批结果;这正是截图比对、数据回放、缺陷复现需要的性质。相反,Math.random 无法设种子,两次刷新必然不同,不适合做测试夹具。数值复算表里的五条示例就是这条序列从头跑五轮的结果。
重复是正常现象。默认样本的 5 条里「上海云启贸易有限公司」出现了两次。词库不大、序列又固定,撞名并不罕见;页面单独报「不重复名称数」,需要条条不同时可换种子或加大数量后自行筛选,但不要为了去重去改写序列 —— 那会破坏可复现性,让种子失去意义。
绝不能用于工商注册。本页只是把四个字符串拼起来,没有做名称预先核准、没有查重名与商标、没有核经营范围,也不代表任何真实存在的法人。拿它去注册、签合同、开发票、开账户、刻章或投标,属于虚构主体,可能带来法律风险;它只适用于占位文本、界面演示、测试数据与教学示例。另外 LCG 低位存在相关性、状态可预测,也不能当密码学随机数用。
完整示例(基准种子实测)
完整示例固定使用数值复算表的基准种子 、字号「云启」、生成 5 条,逐字核对:
- 五条完整序列:;
- 不重复名称数: 条。
这五条公司名不是写死在 HTML 里的,而是页面加载时用自己的 gen 函数按同一条 LCG 序列在三个词库下标上取词、拼装后再填入的,与数值复算表逐条一致。第 3 条与第 4 条相同,正是小词库加固定序列下的正常撞名。
把种子改成 20261108,整批结果会换成另一组;但改回 20261107,五条又会原样回来。这种「换种子全变、同种不变」的确定性,就是本页全部价值的来源,也是它不能拿去做真实名录的原因。
对照表与输入范围
表格列出 14 个不同种子,前 12 行直接可见,后 2 行点「加载更多」展开。每个种子都调用同一个 gen 函数,固定按 5 条取样算出前三条名称与不重复数,因此不是静态速查表:改动字号,全表名称会一起重算,而种子列与不重复数仍可对照。
第一行是基准种子 20261107,也就是默认样本与完整示例共用的锚点。其余覆盖极小种子、连续种子、常见测试常数、年份种子与三十一位上界,方便观察「种子只差 1,结果完全不同」,以及不重复数在 3 到 5 之间的波动。
- 固定种子:1~2147483646,步长 1,即 31 位正整数范围。
- 生成数量:1~50 条,步长 1,每条消耗 3 次随机数。
- 字号:取文本框第一行并去掉首尾空白,建议 1~20 字符,多行其余行忽略。
- 输出格式:带序号、纯名称、逗号分隔三选一,不改变序列。
两个按钮从同一份计算结果生成数据:导出 CSV 带 UTF-8 BOM,Excel 打开中文表头不乱码;复制对照表按 TSV 送进剪贴板自动分列,屏幕所见与导出所得永远一致。
结果边界与舍入
- 种子范围与溢出。种子限定 1~2147483646,填 0、负数、超范围都会写明字段与允许区间;状态按位相与截断在 31 位内,不会溢出成浮点,也不会被静默改成默认种子。
- 取词下标的边界。用
Math.floor(s / 2147483647 * len)映射,当状态恰为 2147483647 时理论上下标会等于 len;页面与数值复算表使用同一个公式,不额外钳位,以保持两边逐字可对照。 - 重复只统计不消除。「不重复名称数」是结果的一个观察值,页面不会为凑数去重或跳过某次取样,否则同一序列就被改写了。
- 字号不随机、取第一行。字号为空会报错,多行只取第一行;改字号不会动到地区、行业、组织形式的顺序,方便把两组结果并排比对。
- 纯本地生成。整条链路是整数乘法、按位相与、下标映射与字符串拼接,无网络请求,不写 Cookie 或 localStorage;结果仅用于演示与测试,绝不能用于工商注册。
常见问题
为什么刷新多少次结果都一样?
因为用的是固定种子的线性同余算法,状态转移是纯函数,页面也不调用 Math.random。种子不变,整条序列和输出就完全不变。
换一个种子会怎样?
哪怕只差 1,整批公司名也会换成另一组,但新种子同样可复现。数值复算表的基准是 20261107,改回它就恢复原结果。
生成的公司名能去注册吗?
绝对不能。页面没做名称核准、没查重名商标、没核经营范围,也不代表真实法人。它只适用于占位文本、界面演示与测试数据。
为什么有两条一模一样?
地区、行业、组织形式词库分别是 5、5、3,序列又固定,撞名很正常。不重复名称数只是统计,不会为了凑数改写序列。
字号能随机吗?
不能。字号是常量,随机只在三个词库的下标上做;这样改字号时其余三段顺序不动,才好与复算表逐条对照。
能自己改词库吗?
本页词库固定为 5、5、3,以保证与数值复算表一致。词库长度一变,取词公式里的 len 就变,整条结果会跟着变。
能当密码或令牌用吗?
不能。LCG 状态可预测、低位有相关性,属于演示用的弱随机,不是密码学随机源,涉及安全的场景请另用专用工具。
会联网或上传吗?
不会。名称全在当前浏览器拼装,页面不发起网络请求,也不写 Cookie 或 localStorage,Network 面板始终是空的。