Minecraft 裏的學問(四):同一個種子爲什麼長出一模一樣的世界

你和朋友輸入同一串數字,各按一次創建。兩臺電腦,兩個存檔,長出來的山在同一處,同一條河拐同一個彎。

你的存檔裏其實沒有那座山。

存檔只存兩樣東西,一串數字,和你改過的那些方塊。剩下的都是打開遊戲時現算的。一個玩了幾百小時的世界,存檔可能只有幾十兆。

現算的東西憑什麼每次都一樣?這篇講隨機數爲什麼不隨機,種子怎麼變成一座山,以及爲什麼理論上有一批不同的種子會長出同一個世界。

隨機數不隨機

計算機裏沒有真正的隨機。真隨機得靠物理過程,比如電路熱噪聲、放射性衰變,不可預測,也沒法復現。

可遊戲要的恰恰是能復現,所以它用的是一個假裝的隨機,學名叫僞隨機數。給它一個起始值,它往後吐出一串看着雜亂、實際完全由起始值決定的數。這個起始值就是種子,幹這件事的算法叫僞隨機數生成器,簡稱 PRNG。

PRNG 有一條硬性質,同一個種子永遠吐出同一串數。山的高度、河的位置、村莊的座標,全都從這串數里取。種子一樣,世界就一樣。

Minecraft 用的是哪一套

老版本用 Java 標準庫裏的 java.util.Random,屬於線性同餘生成器。名字唬人,做法就一行,下一個數等於當前數乘以 25214903917 再加 11,再對 2 的 48 次方取餘。代價是狀態只有 48 位。

1.18 之後另一些地方換成了 Xoroshiro128++,狀態擴到 128 位。現在遊戲裏兩套並存。

關鍵在那 48 位

java.util.Random 接收種子的時候,會先和常數做一次異或,然後只保留低 48 位。種子有多長都沒用,只有後 48 位算數。

種子空間是 2 的 64 次方,而真正能影響生成的只有 2 的 48 次方,兩者差 65536 倍。於是就有一個反直覺的結果,兩個不同的數字,只要後 48 位一樣,隨機數序列就完全一樣。

造出這樣一對種子很簡單,加上或減去 281474976710656,也就是 2 的 48 次方,後 48 位不變。

官方 Wiki 記下了實例。Java 1.17.1 及以前,後 48 位相同的兩個種子,長出來的末地和下界極爲相似;還有更極端的一對,種子相減之後生物羣系分佈除海洋外完全一致。

現在的版本換了隨機數發生器,這個結論不再無條件成立。明白原理就行。

還有一點容易忽略。生成世界的時候,遊戲沒有先吐一長串隨機數再按順序分給每個區塊,它拿世界種子和區塊座標一起算,給每個區塊單獨推出一份隨機源,所以先跑到哪、後補哪,結果都一樣。

文字種子的代價

種子框裏輸中文或英文也行,遊戲會用 Java 的 String.hashCode() 把它換成一個整數。hashCode 返回的是 32 位整數,可用世界一下子砍到 2 的 32 次方,大約 43 億種;數字種子才用得滿 2 的 64 次方,約 1844 億億種,差 43 億倍。

換版本,種子就作廢

21w41a 這個快照換掉了世界生成用的隨機數發生器,同一個種子從此長不出同一片地形;再往後的 21w43a 把噪聲生成器又整個改了一遍。

這就是爲什麼老玩家的種子清單跨大版本基本要重找。種子不是世界的編號,它只是餵給算法的一個輸入,算法一換,輸入的意義就變了。

種子不是名字,世界也不是存下來的

Wiki 專門說過,用 diamond 當種子不會讓你挖到更多鑽石,種子就是個數字,跟生成結果沒有語義上的聯繫。Java 版和基岩版也不能想換就換,1.18 起同一個種子只保證地形和生物羣系一致,結構和礦石分佈不同。至於世界是被存下來這個印象,反過來想最清楚,刪掉某個區塊的存檔文件、保持同種子同版本,那塊地能原樣長回來。

可復現是計算科學的硬要求。用隨機數的實驗不公開種子,別人就復現不出結果,所以論文要寫明隨機種子,蒙特卡洛模擬和機器學習訓練都是這個規矩。Minecraft 的種子機制是它的通俗版,把隨機固定住,結果纔可分享、可驗證。

還有個推論常被提到。線性同餘的狀態能反推,看到幾段連續輸出就能算出當前狀態,預測後面所有的數。這是種子破解工具的原理,也是它不能用在加密上的原因。

線性同餘是德里克·亨利·萊默在 1949 年提出的。他 1905 年生於伯克利,父親就是伯克利分校的數學教授,他本科學的是物理,碩士和博士在布朗大學才轉到數學。

萊默一輩子研究數論,最出名的是梅森素數的判定方法,那套檢驗到現在還叫盧卡斯-萊默測試,跟遊戲離得很遠。1949 年,他在一次關於大型計算機械的學術會議上給出一套在計算機上產生隨機數的辦法,就是線性同餘。有資料把它記作最早公開發表的僞隨機數生成方法,而且至今還在用。

他最初那版更簡單,只有乘數和模數,沒有加數。今天 java.util.Random 用的形式多了個加數 11,是後來補上的改良。

一個人研究了一輩子素數,寫在論文裏的一個公式,七十多年後在你電腦上堆出一座山。

更多遊戲資訊請關註:電玩幫遊戲資訊專區

電玩幫圖文攻略 www.vgover.com