使用方法
- 填「生成数量」,默认 12 个,范围 1~50。一次生成太多意义不大——超过 30 个之后,用生日悖论算出来的「本该重名」的概率会超过 5%。
- 填「随机种子」,默认 20261004。同一个种子加同一套参数,永远得到同一批名字;把种子发给同事,对方就能复现你看到的那 12 个。
- 选「词素风格」,默认中性(尾音节库 24 个)。切成月语或林语时,尾音节库缩到 12 个,整批名字的收尾音会明显统一。
- 选「音节结构」,默认混合,双音节和三音节都出。想要名字短促就选「只用双音节」,想要更长更绕就选「只用三音节」。
- 选「附中文译名」,默认附上。译名是按音节逐段查表拼的直译,不是真名,用来读顺口或做角色设定都够用。
- 点「生成名字」或在任一输入框里按 Enter。结果区一次列出全部名字,超过 15 个时结果框内部滚动。
- 「复制结果」拿到纯文本名单,「导出 CSV」把重名概率对照表存成带 BOM 的文件,Excel 打开中文不乱码。
精灵名字生成器能解决什么问题
一是给奇幻设定的角色批量取名字。写小说、跑团、做游戏时,一个精灵村落要十几个名字,纯靠手编很快就重复。这个精灵名字生成器的三个词素池每次洗牌后取前若干条,一批 12 个名字互不重复,可以直接贴进设定文档。
二是让结果可复现、可分享。名字生成器最常见的问题是「刷出一批好看的,再也刷不回来」。本页把随机数换成带种子的确定性算法,种子 20261004 永远对应同一批 12 个名字,团队协作时可以直接说「用种子 20261004 那批」。
三是按语音风格挑词素库。月语风格的尾音节集中在 mir / riel / neth / vyn 这类带鼻音和流音的收尾上,听感偏柔和;林语风格集中在 wen / las / dor / ath 这类爆破与齿音上,听感偏硬朗。这是用「库」而不是用「滤镜」做出的风格差异,拼出来的名字是词素层面的真差异。
四是顺手得到中文译名。给中文团跑团或写中文小说时,光有拉丁字母名没法念。本页按音节逐段查表,把 elaanorn 译成「艾拉安奥恩」,保留了音节数,不会出现一个三音节名被译成两个字的情况。
本页不做的事:它只拼名字,不做姓氏、不做称谓、不做背景故事,也不判断名字是否符合某种版权作品的既有角色名。想要中文姓名的组合请用虚拟姓名生成器,想要某个具体题材的名字请用对应题材的名字生成器。
原理:词素库、可复现随机与洗牌去重
名字由三段词素拼成,双音节省掉中段。首音节池 24 个、中音节池 12 个、尾音节池 24 个。双音节名的结构是「首 + 尾」,共 24 × 24 = 576 种;三音节名是「首 + 中 + 尾」,共 24 × 12 × 24 = 6,912 种。两者合计 576 + 6,912 = 7,488 种,这就是本页右上角「组合空间」那一格的来源。
随机数用的是 mulberry32,不是 Math.random。Math.random() 无法指定种子,也就无法复现。mulberry32 是一个 32 位整数状态的伪随机数发生器,每次调用把状态自增一个常数 0x6D2B79F5,再经过三轮异或与乘法混合,最后用 >>> 14 取高位,除以 2^32 得到一个 [0,1) 的浮点数。它只需要一个整数种子就能完全决定后续序列,因此种子相同必然结果相同。
种子按 32 位取模,所以 0 和 4294967296 等价。函数第一句是 a |= 0,它把入参截断成 32 位有符号整数。2^32 − 1 = 4,294,967,295 是能保留原值的最大的种子;填 4,294,967,296 会被截成 0,填非整数 1.5 会被截成 1。本页的种子输入框把范围卡在 0~4,294,967,295,就是为了让「你看到的种子」和「实际生效的种子」永远一致。
去重靠 Fisher–Yates 洗牌,而不是「抽到重复就再抽」。先把 7,488 个候选取出来,用同一个 rnd() 做一次从后往前的 Fisher–Yates 洗牌:第 i 位与 [0, i] 中随机一位交换,交换完就把这一位固定下来。洗牌之后按顺序取前 n 个,天然互不相同——因为它们是排列的前 n 项,不是放回抽样的结果。这比「循环重抽直到不重复」既快又确定:重抽法在 n 接近池大小时可能长时间打转,而洗牌法一次遍历就结束。
中文译名是逐音节查表,不做音变。三个池各配一张「音节 → 汉字」表,例如 ael → 艾尔、orn → 奥恩、eth → 丝。翻译时把名字按音节切开,逐段取汉字再拼接,所以 doreeth 拆成 dor + e + eth,译成「多尔 + 厄 + 丝」=「多尔厄丝」。这样做的代价是译名读起来偏生硬(真实音译会做省音和连读),好处是完全可预测:同一个音节永远译成同一个汉字,不会两次生成出两种译法。
为什么要做 Unicode 归一化。如果把带分音符的写法(ë)加进词素库,就要注意它有两种等价的编码方式:预组合的 U+00EB 是 1 个码元,而 e 加组合分音符 U+0308 是 2 个码元,两者显示一样但字符串比较不相等。本页的词素全是 ASCII,不会踩这个坑;如果你自己往池里加了带变音符号的音节,记得先用 normalize('NFC') 统一,否则去重会失效。
完整示例(数值仅作演示)
页面打开时的默认参数是:数量 12、种子 20261004、词素风格中性、音节结构混合、附中文译名。下面是这套参数生成的完整名单。
- 总计 12 个名字,其中三音节 11 个、双音节 1 个(
oriwyn),同一次生成内重名 0 个; - 第一个名字是
elaanorn(艾拉安奥恩),由首音节ela、中音节an、尾音节orn拼成; - 拉丁名长度在 5 到 9 个字母之间,全库平均 7.62 个字母;双音节 576 种、三音节 6,912 种,合计 7,488 种;
- 中文译名长度在 3 到 6 个汉字之间,最长的一个是「芬恩阿伊斯」;
- 把种子改成 1,同一套参数得到的是「maeilath / uvaanys / silornis」开头的另一批,与上面 12 个完全不重叠;
- 把风格从「中性」改成「月语」后,尾音节池从 24 个缩到 12 个,组合空间从 7,488 种降到 3,744 种,生成的名字收尾音会集中在
mir / riel / neth / vyn这一组上。
再看一个概率上的边界例子:如果按纯随机放回抽样,一次抽 12 个时出现重名的概率约 0.878%,抽到 50 个时升到 15.091%。这个值用生日悖论近似算:p ≈ 1 − exp(−n(n−1) ÷ 2N),其中 N = 7,488。本页因为做了整池洗牌,实际重名数恒为 0,所以第二列只用来提示「什么时候该换一批」。
输入范围与组合对照表
下表是不同生成数量下「纯随机抽样会重名」的概率,用生日悖论公式算出,N 取中性风格的 7,488。第三列是本页的真实表现。
| 一次生成的数量 | 组合空间 N | 生日悖论重名概率 | 本页实际重名 | 说明 |
|---|---|---|---|---|
| 2 个 | 7,488 | 0.013% | 0 | 几乎不可能重名 |
| 4 个 | 7,488 | 0.080% | 0 | 无需担心 |
| 6 个 | 7,488 | 0.200% | 0 | 无需担心 |
| 8 个 | 7,488 | 0.373% | 0 | 无需担心 |
| 10 个 | 7,488 | 0.599% | 0 | 无需担心 |
| 12 个(默认) | 7,488 | 0.878% | 0 | 本页默认档位 |
| 16 个 | 7,488 | 1.590% | 0 | 仍很安全 |
| 20 个 | 7,488 | 2.505% | 0 | 仍很安全 |
| 25 个 | 7,488 | 3.927% | 0 | 接近 4% |
| 30 个 | 7,488 | 5.644% | 0 | 可考虑分两批 |
| 40 个 | 7,488 | 9.892% | 0 | 建议分两批 |
| 50 个 | 7,488 | 15.091% | 0 | 建议换风格或换种子 |
再看三套词素库的规模对照。风格不是给名字加装饰,而是直接换掉整个尾音节池,组合空间因此差一倍。
| 词素风格 | 首音节 | 中音节 | 尾音节 | 组合空间 | 收尾听感 |
|---|---|---|---|---|---|
| 中性 | 24 | 12 | 24 | 7,488 | 全库混合,最杂 |
| 月语 | 24 | 12 | 12 | 3,744 | 鼻音与流音收尾,偏柔和 |
| 林语 | 24 | 12 | 12 | 3,744 | 爆破与齿音收尾,偏硬朗 |
输入范围、边界与精度说明
- 数量限 1~50 的整数。0 会被拦下(生成 0 个名字没有意义),小数会被拦下(不能生成半个名字),超过 50 会被拦下并提示改用两批。上限 50 不是技术限制——洗牌本身能支撑 7,488 个——而是超过之后清单已经不适合人眼通读。
- 种子限 0~4,294,967,295 的整数。这正是 32 位无符号整数的范围。低于 0 或高于上限都会被拦下,因为那些值会被
| 0悄悄改掉,导致「显示的种子」和「真实种子」不一致,破坏可复现性。 - 同一种子下结果完全确定。整条链路只有两个随机来源:mulberry32 与 Fisher–Yates。两者都由种子唯一决定,所以同一组参数必得同一批名字。这也意味着「多刷几次碰运气」这个操作在本页不存在——想换结果就换种子。
- 译名长度在 3~6 个汉字。双音节名译成 3~4 个字,三音节名译成 4~6 个字。译名总字数等于各音节汉字数之和,因为本页不做省音与连读,所以看起来会比常规音译略长。
- 拉丁名长度在 5~9 个字母。最短的形态是「3 字母首音节 + 2 字母尾音节」的组合,最长是「3 + 2 + 4」。平均 7.62 个字母,落在常见西文名字的长度区间内。
- 候选池在每次生成时当场重算。这个精灵名字生成器用三层循环即时拼出 7,488 个候选,再走一次 7,488 步的洗牌,整轮耗时在一毫秒量级,连点几十次也不会卡,所以不做常驻缓存——池子随风格与音节结构变化,缓存反而要额外维护失效逻辑。
- 译名表只覆盖池内音节。如果你自己往池里加了新音节而没有同步补译名表,那个音节会译成空字符串,名字仍会生成但中文译名会缺一段。这是刻意的失败方式:宁可露出缺口,也不要静默编一个不存在的译法。
- 本页刻意不做的近似。不做音节和谐(元音搭配筛选)、不做重复字母抑制(比如避免
laell这类三连音)、不做姓氏与称谓。这些都是「再上一层的规则」,加了之后随机性会下降,可复现性也会变复杂。
常见问题
为什么刷新页面后名字变了,说好的可复现呢?
刷新后种子输入框会回到默认值 20261004,所以默认那一批永远一样。真正会变的是你改了种子之后——种子是唯一决定结果的东西。如果发现同一种子给出不同结果,请确认三件事:数量、风格、音节结构也都没变,因为它们是候选池的一部分,池变了洗牌结果自然不同。
名字看起来像随机字母,不像「精灵语」?
因为本页的词素库是原创的,不取自任何既有作品的语言。这样做的原因是避免版权争议:真实作品的精灵语词汇是受保护的作品元素,直接搬用会给使用者的作品带来风险。ael / riel / neth / vyn 这类音素组合只是模仿了「听感」,不是任何语言的真实词根。
为什么一次生成 50 个以上就不建议了?
因为可用性随数量下降。用生日悖论算,纯随机抽 50 个时重名概率已经 15.091%,虽然本页靠洗牌保证实际不重复,但 50 个名字放在一起时,mir / riel / neth 这些高频尾音会让它们读起来很像,反而不好挑。分批生成、每批换一个风格或种子,比一次性拉 100 个更好用。
中文译名能自己改吗?
当前页面没有开放译名表编辑,但译名规则是透明的:每个音节固定对应一个汉字,改名字等于改音节组合。如果你的角色名字有固定的中文叫法(比如设定里叫「艾拉诺恩」而不是「艾拉安奥恩」),直接把生成结果的中文那一列替换掉即可,拉丁名不受影响。
种子填 4294967296 会怎样?
会被拦下。4,294,967,295 是 32 位无符号整数的最大值,再往上一格会被 | 0 截断成 0,也就是和填 0 得到同一批名字。本页宁可报错也不接受一个「显示值和实际值不一样」的种子,因为那会破坏可复现这个核心承诺。
为什么双音节名字这么少?
因为候选池里双音节只有 576 种、三音节有 6,912 种,前者占 7.7%。洗牌是对整池做的,所以抽到双音节的概率也是 7.7% 左右。默认那 12 个里只出现 1 个双音节(oriwyn),比例上完全正常。想要更多短名字,把音节结构切成「只用双音节」即可。
名字里有重复字母怎么办?
会照原样保留。比如 elaanorn 里有两个相邻的 a,这是中音节 an 接在首音节 ela 后面的自然结果。本页刻意不做「抑制连续元音」的规则,因为加了之后每加一条规则就多一层筛选,池的实际可用规模会缩水,可复现性也难解释。如果你介意,换一个种子通常就能避开。
生成的名单能不能直接商用在游戏或小说里?
可以。词素库是原创的,名字由算法组合而来,不指向任何既有人物。唯一需要注意的是「组合空间只有 7,488」这个事实:如果和你用同一套参数的人很多,理论上可能撞名。想降低撞名概率,换一个不常见的种子,或者把风格的三套库混合使用,就等于把可用空间扩到 14,976 种。