連點幾次重新產生,開頭永遠是那三個詞
用佔位文字時我有個疑問:每次重新產生,前三詞都是 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 個不同。