连点几次重新生成,开头永远是那三个词
用占位文本时我有个疑问:每次重新生成,前三词都是 Lorem ipsum dolor,那句有没有参与随机。为此把生成器脚本整段切出来实测:切出的脚本块 124 行、4682 字符,一字不改丢进沙箱执行,输入用 stub 喂值;模板本体 175 行、8390 字节。
拉丁词表:120 个槽位、115 个不同词
清点 latinWords:数组 120 条,去重剩 115 个词,差的 5 个位置是重复占位——sed 下标 8 和 90、id 59 和 105、est 60 和 114、voluptas 85 和 112、omnis 111 和 115。按下标取词,这 5 个词被抽中的概率是别人的 2 倍:12 万次抽样(seed=23)实测双槽词平均 2011.2 次、单槽词平均 1019.5 次,倍数 1.9727。120 是条数,115 只是去重后的唯一词数。
平均词长 5.975 字符,最短 do 2 字符、最长 exercitationem 14 字符。
图 1:多出的 5 个槽位带来 2 倍概率
randInt 含上界,句长是 8 到 20 词的闭区间
randInt 源码带 +1,区间双端闭合:跑 100000 次 randInt(0,2),上界 2 命中 33447 次;randInt(8, 20) 的 13 档全命中,20 出现 7613 次。模板真实调用点同样跑 100000 次,120 个下标全可达,末槽 119 命中 849 次、期望 833.3,没有 off-by-one。
所以拉丁句词数不是定值:100000 句实测平均 13.9854 词、97.60 字符;40 万句里最短 30 字符、最长 199 字符。有放回导致同一句里重复抽到同一个词,55.57% 的生成句内部含重复词。句末固定一个句点,句内不出逗号。
开篇那句是 L127 整串塞进去的
这个页面是 Lorem Ipsum 占位文本生成器。generateLatinParagraph 的条件是三重门,只有首段首句且勾选时才把那句经典句整串推进数组——它不在词表里,56 字符、8 词、含 1 个逗号。默认档连跑 1000 次真实 generate(),前 3 词等于 Lorem ipsum dolor 的占比 100.0%,同口径取消勾选是 0.0%、开头种类数从 1 种变 1000 种。
旁证是逗号:关档 40 万句里逗号 0 个,开档 10 万句恰 500 个。默认 3 段 × 5 句下,这个零随机成分只占输出的 3.89% 字符、6.67% 句数。可复现口径要交代:页面不提供种子,全文 seed 计数 0,上面这些分布都是探针层替换 Math.random 才跑出来的。
同参数连跑 1000 次,重复的是那一句
口径:3 段 × 5 句连跑 1000 次,即 15000 句、3000 段、1000 份。拉丁开档 15000 句里不同 14001、重复键只有 1 个,即经典句的 1000 份副本,最长重复句 8 词 56 字符,段与整份零重复;关档 15000 句全不同。中文档 15000 句只出自 15 个值,每条出现 967 到 1055 次,3000 段撞出 5 个重复段——空间是 15 的 5 次方即 759375,生日期望 5.93;每段句数压到 1,整份输出只剩 868 个不同、最多重复 3 次。不替换 Math.random 复核也是同一结构。
图 2:1000 连跑的重复账
中文档是 15 条整句,不是字表
chineseSentences 有 15 条、整表零重复,长度 20 到 25 字符、平均 22.2 字符,合计 333 字符即 999 字节。句号写死在每条串里,抽中哪句贴哪句,字与字之间没有任何随机性。generateChineseParagraph 用空串拼接,段内不插空格与换行:实测一个 5 句段 112 字符,反查全是库内整句。
字符与字节是两本账
| 口径 | 拉丁档 | 中文档 |
|---|---|---|
| 3 段 × 5 句 | 1433 字符 = 1433 字节 | 335 字符 = 997 字节 |
| 20 段 × 10 句 | 19776 字符 = 19776 字节 | 4458 字符 = 13298 字节 |
| 统计条第三格 | 单词数 201 | 字数 335 |
拉丁档纯 ASCII,非 ASCII 字节 0;中文档每个全角字符固定 3 字节,335 字符里 4 个换行,331 乘 3 加 4 得 997。同参数下字符比 0.2338、字节比 0.6957。中文档那格写作「字数」,与「总字符数」永远同值,含标点与换行,不是汉字数也不能当字节数用。
非法输入静默兜底,页面没有一句错误文案
换算链是 parseInt、假值兜默认、再夹上下界,min 与 max 属性对脚本无约束。段落框输 0 得到的是默认 3 段而不是下限 1,负数才被夹成 1;10000 夹成 20 段 × 10 句,实测 19466 字符、2.439 ms;默认档连跑 5000 次平均 0.165 ms。parseInt 还会把 0x10 读成 16 段、把 1e3 只认到 1 段。全文 try、catch、alert 与「错误」计数全 0,download 与 Blob 也是 0,唯一出口是复制。
勾选框只管拉丁档:generateChineseParagraph 是单参函数,不读它,同 seed 下中文档勾选与取消的输出逐字节相同,都是 345 字符。shuffle 在全文 175 行里只出现 1 次,即 L102 的定义行,零调用点。句子不是打乱词表得来的:840510 个相邻二元组里,经典原文的相邻对只命中 618 次、占 0.0735%,与不看上文的期望 58.37 次同量级;sed do 因 sed 占 2 槽得 120 次。打乱该怎么写,旧文 shuffle 该用哪种写法 另有一篇。
文案与代码的 11 条对照
逐条判定 11 条:一致 6、部分一致 3、冲突 2。冲突一是那句「不是随机文本」,默认档唯一确定的只有开头 56 字符;冲突二是输出框那句占位提示,脚本末尾无条件跑一次 generate(),首屏即有值,不会显示。
FAQ
Q:为什么每次开头都是 Lorem ipsum dolor sit amet?
那是源码里的一整串,只在首段首句且勾选时推进数组,1000 次抽样命中 100.0%,关勾选同口径 0.0%。
Q:词表到底是 120 还是 115?
数组是 120 条,115 是去重后的唯一词数;按下标取词,那 5 个各占 2 槽的词概率翻倍,实测倍数 1.9727。版面与体量怎么估是另一件事,见旧文 占位文本怎么写才不像模板。
Q:中文档是随机拼字吗?
不是。它是 15 条整句的库,抽中哪条贴哪条,段内空串拼接、不加分隔符,每段句数压到 1 时 1000 份整输出只剩 868 个不同。