亂數種子:同一個種子,同一張地圖
1.3 種子的三種常見型態
不同遊戲對種子的處理方式差異很大,大致可以分成三類:
第一類:整數種子。最單純的形式,例如一個 32 位元或 64 位元的整數。《Minecraft 基岩版》的種子本質上是 32 位元整數,《泰拉瑞亞》也是走類似路線。整數種子的好處是明確、好複製,缺點是「種子空間」可能不夠大。
第二類:字串種子。你輸入一串文字,遊戲內部先把這串文字「雜湊」(hash)成一個整數,再拿這個整數當種子。《Minecraft Java 版》就能接受文字種子,這也是為什麼會出現「輸入自己的名字當種子」這種玩法。要注意的是,字串種子的轉換規則會隨版本改變,這也是為什麼跨版本的同一個種子,地圖可能完全不同。
第三類:複合種子。世界種子只是「母種子」,遊戲會用母種子再派生出一堆「子種子」,分別負責地形、礦物、結構、生物生成。這種設計讓開發者可以獨立調整某一層的生成邏輯,不會牽一髮動全身。
二、為什麼同一個種子,一定會生成同一張地圖?
2.1 確定性演算法的骨幹
我們用最簡單的線性同餘生成器(Linear Congruential Generator,LCG)來示範這件事。它的公式是:
next_state = (a * state + c) mod m
其中 a、c、m 是固定的常數,state 就是當前的「種子狀態」。
假設 a = 1664525、c = 1013904223、m = 2^32。你給它種子 12345,它就吐出某個數字;你把同樣的 12345 再丟進去一次,它吐出來的還是同一個數字,下一個、下下一個也都一樣。原因很簡單:公式裡沒有任何「外部變數」,所以結果必然可重現。
真實遊戲用的 PRNG 當然比 LCG 複雜得多——可能會用梅森旋轉演算法(Mersenne Twister)、PCG、Xoshiro,或遊戲自製的混合演算法。但核心精神完全一樣:演算法固定 + 初始狀態固定 = 輸出序列固定。
2.2 從種子到地圖:地形生成的完整流程
知道種子會產生固定的隨機序列之後,下一個問題是:這串數字是怎麼變成「山、河、森林、村莊」的?大致可以拆成以下幾個階段:
步驟一:雜湊與初始化。玩家的輸入(字串或數字)先被轉換成一個內部種子值,用來初始化 PRNG。有些遊戲會先做一次攪拌(scramble),讓相鄰的種子值不會產生過於相似的世界。
步驟二:雜訊函式取樣。這是最關鍵的一步。遊戲會用 Perlin Noise、Simplex Noise 或 OpenSimplex Noise 這類「連貫性雜訊」(coherent noise)函式,在二維或三維網格上取樣,得到一張平滑起伏的數值場。這種雜訊的特性是「相鄰的點數值相近」,所以畫出來會像自然地形的坡度,不會是純白的雜訊點。
步驟三:分形疊加(Fractal / FBM)。單層雜訊太單調,所以遊戲會把好幾層不同頻率、不同振幅的雜訊疊在一起:低頻決定大陸與山脈的大輪廓,中頻決定丘陵與河谷,高頻負責石頭、草地這類細節。這就是所謂的「碎形布朗運動」(Fractal Brownian Motion)。
height(x, y) =
0 * noise(x / 256, y / 256) // 大陸尺度
+ 0.5 * noise(x / 64, y / 64) // 丘陵尺度
+ 0.25 * noise(x / 16, y / 16) // 細節起伏
+ 0.125 * noise(x / 4, y / 4) // 碎石紋理
步驟四:生物群系判定。得到高度場之後,再加進溫度、濕度、奇異度(weirdness)等第二層雜訊,交叉比對後決定每個座標屬於哪個生物群系。這一步決定了你會不會出生在沙漠、雪原還是蘑菇島。
步驟五:結構與裝飾物放置。要塞、村莊、遺跡、地牢這些「結構」,通常使用獨立的隨機流。開發者的做法是:拿世界種子,加上一個固定的「鹽」(salt,例如字串 “village” 或某個常數),再雜湊成結構專用的子種子。這樣做的好處是:結構的分布可以獨立控制,而且只要你改動地形生成邏輯,結構的位置依然可以保持相對穩定。
步驟六:區塊載入時的即時生成。很多遊戲不是「一次生成整張地圖」,而是「玩家走到哪、生成到哪」。每個區塊(chunk)會用「世界種子 + 區塊座標」去算出該區塊專屬的子種子。這種設計稱為「可重入生成」(re-entrant generation):你離開再回來,區塊被重新載入時,還是會算出完全一樣的內容。
把這六步串起來,你就會明白:地圖其實是「種子經過一連串確定性運算」的結果。種子變了,結果才會變;種子不變,哪怕你重開一百次,那棵樹還是長在原來的位子上。
2.3 為什麼「同一個種子」有時還是會不一樣?
這裡要補一個很重要的例外。很多玩家會抱怨「我明明用了朋友的種子,為什麼地圖長得不一樣?」常見原因有四個:
所以,種子分享的第一條鐵律是:種子 + 遊戲版本 + 平台 + 設定,四個要素要一起講清楚。只貼一串數字,等於只講了四分之一。
三、各大遊戲的種子機制比一比
3.1 《Minecraft》:種子文化的發源地
《Minecraft》大概是史上最把「種子」當成社交貨幣的遊戲。從 2010 年代的 Alpha 版開始,玩家就發現輸入同樣的數字會得到同樣的世界,於是論壇上開始出現「種子串」,大家互相分享「出生點旁有村莊」、「五分鐘內找到要塞」的神圖。
Java 版的種子空間是 64 位元有號整數,範圍大約是負九兆到正九兆。這個數字有多大?大約是 1.8 × 10¹⁹ 種可能。理論上,你隨便輸入一個數字,幾乎可以保證它是「世界首見」的——因為全世界玩家測試過的種子數量,遠遠比不上這個空間的總量。
但要注意幾件事:
3.2 《泰拉瑞亞》:世界種子與秘密種子
《泰拉瑞亞》同樣支援世界種子,而且它的種子系統有一個很有趣的進化:除了普通的數字種子之外,官方還加入了「秘密種子」(Secret Seeds)機制。某些特定的文字種子會觸發特殊的世界規則,例如:
輸入特定字串可以讓世界變成「飢荒模式」(世界永遠是黑暗的、食物會腐敗)。
某些種子會讓世界充滿陷阱、或讓所有敵人都變成爆炸兔。
還有一些種子純粹是彩蛋性質,會改變背景音樂或 NPC 的對話。
這種設計把種子從「地圖座標」升級成「遊戲規則開關」,是相當聰明的做法。玩家分享的不再只是「這張圖很好挖礦」,而是「這張圖的體驗完全不同」。
3.3 《飢荒》與《飢荒聯機版》:地圖種子與世界自訂
《飢荒》的世界生成同樣依賴種子,而且它的生成邏輯更偏向「規則驅動」:遊戲會先決定這張圖要包含哪些生態環境(豬人村、沼澤、沙漠、月島……),再根據權重把它們塞進地圖。種子決定的是「生態環境的排列組合」與「資源點的具體位置」。
聯機版還加入了「世界自訂」(World Customization)功能,讓玩家可以調整資源密度、怪物強度。這意味著同一個種子在不同設定下,地圖依然會不一樣——再次印證了「種子只是四要素之一」。
3.4 Roguelike 類:《以撒的結合》與《殺戮尖塔》
這一類遊戲的種子概念跟沙盒遊戲不太一樣。Roguelike 的「地圖」通常是「一層一層的房間組合」,種子決定的是房間順序、道具掉落、敵人配置。
《以撒的結合》有很成熟的種子分享機制:你可以直接輸入一串英數字,重現某一次遊玩的完整流程。對速通玩家來說,這代表「同一條路線可以被無數人反覆研究」。每日挑戰更是強制使用當天日期作為種子,讓全世界玩家在同一天面對完全相同的關卡。
《殺戮尖塔》也支援種子系統,玩家可以分享「這局有神卡」的種子,讓朋友體驗同樣的開局。這類遊戲的種子樂趣在於:沙盒遊戲的種子決定「你在哪裡」,Roguelike 的種子決定「你會遇到什麼」。
3.5 其他值得一提的例子
《Factorio》:地圖生成器提供種子欄位,並且可以調整礦物頻率、水體大小、敵人生成等參數。玩家常分享「礦區超密集」的種子。
《No Man's Sky》:整個宇宙都是程序化生成,每顆星球都有對應的種子座標。玩家可以透過「傳送門座標」分享星球。
《瓦爾海姆》(Valheim):世界種子決定大陸分布,玩家會挑「出生點附近就有商人」的種子。
《薩爾達傳說:王國之淚》/《曠野之息》:雖然不能自訂種子,但遊戲內部的隨機狀態(例如刷武器、刷人馬)可以透過存讀檔或特定操作重現,這也算是種子概念的變體。
四、玩家實戰:種子的搜尋、驗證與應用
4.1 怎麼找到「好種子」?
找種子這件事,早期靠的是「土法煉鋼」:開新世界、記下種子、跑圖、貼上論壇。現在則有幾種更有效率的方法:
方法一:社群分享。論壇、Discord、Reddit 的種子版,每天都有人在貼「出生點神圖」。關鍵是要看清楚對方的版本號、平台、以及他想強調的賣點(村莊?要塞?終界城?)。
方法二:種子地圖工具。輸入種子後,工具會模擬地形生成,直接在地圖上標示結構位置。這讓你可以在不開遊戲的情況下,先確認「這張圖到底有沒有料」。
方法三:自己寫程式掃描。進階玩家會用社群提供的 API 或開源函式庫,寫腳本批次掃描大量種子,設定條件(例如「出生點 200 格內要有村莊,且 1000 格內要有要塞」),讓電腦幫你篩。這個做法在《Minecraft》社群裡很常見,尤其是速通玩家。
方法四:觀察種子數字的規律。有些玩家發現,特定形式的種子(例如很小的數字、重複數字、或是特定尾數)比較容易生成有趣的結構。這多半是統計上的錯覺,但有時候確實能撈到寶。
4.2 拿到種子之後,怎麼驗證?
驗證種子的流程其實很簡單,但魔鬼藏在細節裡:
4.3 種子在速通(Speedrun)中的應用
速通玩家對種子的態度很有意思。在「隨機種子」(Random Seed)類別的競速中,玩家不能挑種子,必須當場生成、當場適應,這考驗的是臨場反應與地圖判讀能力。但在「固定種子」(Set Seed)類別中,所有參賽者使用同一個種子,比的就是「誰能把這張圖的路線最佳化到極致」。
固定種子競速的準備過程通常長這樣:
選定種子,反覆遊玩數十次,記錄每次的路線與時間。
用種子地圖工具分析結構位置,規劃最短路徑。
研究隨機事件(例如怪物生成、掉落物)在這個種子下的分布,判斷哪些環節可以「凹」、哪些必須避開。
把路線寫成筆記,甚至做成圖文攻略,分享給社群。
這其實就是把「隨機」轉化成「可研究的對象」。當種子固定,遊戲就從「運氣遊戲」變成「資訊遊戲」——誰掌握更多地圖知識,誰就有優勢。
五、進階議題:種子與亂數管理的那些坑
5.1 種子碰撞與「世界重複」
種子空間再大,也是有限的。32 位元種子只有約 42 億種可能,而全世界玩家開過的世界數量早就超過這個數字。這代表什麼?代表「理論上」會出現不同玩家使用不同種子、卻生成完全相同世界的情況,這叫做種子碰撞(seed collision)。
64 位元種子的碰撞機率就低得多,幾乎可以忽略。但要注意,碰撞與「相似」是兩回事:有些遊戲因為只使用種子的部分位元,會導致大量種子生成高度相似的世界,這不是嚴格意義上的碰撞,但玩家體驗上差不多。
另外,PRNG 本身的週期也很重要。如果 PRNG 的週期太短,長時間遊玩後可能會出現「隨機序列重複」的現象——理論上會發生,實務上很少見,但對於需要長時間模擬的遊戲(例如大型沙盒或模擬經營),開發者還是會選用週期夠長的演算法。
5.2 時間種子的陷阱
很多遊戲在玩家不指定種子時,會用「當前時間」當種子。這聽起來很合理,但有一個經典陷阱:如果時間精度不夠(例如只用到秒),而玩家又快速連續開新世界,就可能生成兩個完全相同的世界。
更糟的情況是「可預測性」。如果攻擊者知道你的種子產生規則,理論上可以預測你接下來會生成什麼世界。對單機遊戲來說這無傷大雅,但對多人伺服器或涉及交易的系統,就可能被利用。
所以成熟的遊戲通常會混合多個熵源:時間 + 記憶體位址 + 系統亂數 + 玩家輸入的雜湊值,再用雜湊函式攪拌一次,確保種子夠「亂」。
5.3 平行生成與順序依賴
現代遊戲為了效能,常常把地圖生成拆成多執行緒平行處理。這裡有一個很容易踩的坑:如果多個執行緒共用同一個 PRNG,那麼「誰先要到隨機數」就會影響結果,導致同一個種子在不同硬體、不同執行順序下生成不同地圖。
解決方案是「每個區塊用獨立的子種子」。也就是說,不要共用一個全域 PRNG,而是用「世界種子 + 區塊座標 + 用途標籤」去雜湊出一個專屬種子,每個區塊、每個用途都有自己的 PRNG 實例。這樣不管執行順序怎麼變,結果都一樣。這正是《Minecraft》等遊戲的做法。
5.4 種子與存檔的關係
最後提醒一個實務問題:種子通常只決定「初始生成」,不決定「後續變化」。你在遊戲裡蓋的房子、砍的樹、殺的怪,這些狀態是存在存檔裡的,跟種子無關。所以:
如果你用同一個種子開新世界,你會得到「原始地貌」,但不會有你朋友存檔裡的建築。
如果你把別人的存檔連同種子一起拿來,你看到的會是「他玩過的世界」,而不是「種子原始生成的樣子」。
有些遊戲會把種子寫進存檔的 metadata,方便你日後重現;有些則不會,這時就得自己記下來。
六、常見問題 FAQ
Q1:同一個種子,在不同電腦上跑,地圖會一樣嗎?
只要遊戲版本、平台、設定都相同,而且生成邏輯沒有依賴硬體特性(例如浮點數精度差異),地圖就會一樣。但實務上,跨平台(Java 版 vs 基岩版)通常不一樣。
Q2:我可以自己「發明」一個神種子嗎?
可以,但你得先知道「神」的定義。如果你的條件是「出生點旁邊有村莊」,那隨便掃幾百個種子就可能找到;如果你的條件是「五分鐘內能打完終界龍」,那可能要掃幾千萬個種子,需要寫程式輔助。
Q3:為什麼我輸入文字種子,有時候會顯示「無效種子」?
有些遊戲只接受數字,有些則會把文字雜湊成數字。如果遊戲不接受你的輸入,通常是因為格式不符,或是版本不支援文字種子。
Q4:種子可以拿來作弊嗎?
看你怎麼定義「作弊」。在單機遊戲裡,用種子找資源是官方允許的玩法;但在多人伺服器或競速比賽中,主辦單位可能規定必須使用隨機種子。參賽前請務必看清楚規則。
Q5:為什麼有些種子地圖網站顯示的結果,跟我實際開遊戲不一樣?
最常見的原因是版本不符。其次可能是網站使用的模擬程式與遊戲實際演算法有細微差異(尤其是結構生成與裝飾物)。建議把網站結果當作「參考」,實際還是要開遊戲驗證。
Q6:種子會影響遊戲的難度嗎?
會,而且影響很大。出生點在資源豐富的地區,前期就輕鬆;出生在孤島或沙漠,可能連木頭都很難找。這也是為什麼速通玩家會特別挑種子。
七、結語:把「隨機」變成「可理解的秩序」
回到文章開頭那句話:「同一個種子,同一張地圖。」這句話背後其實藏著一個很迷人的概念:隨機只是一種我們還沒拆解完的秩序。
當你不知道種子的存在時,地圖是隨機的、是不可預測的、是每次開新世界都要重新適應的。但當你理解了 PRNG、雜訊函式、子種子派生這些機制之後,地圖就變成一本可以被閱讀的書——你可以查目錄(種子地圖工具)、可以對照版本(確認生成規則)、可以重複實驗(固定種子跑同一條路線)。
對一般玩家來說,種子最實用的價值是「分享」。你可以把一張好圖變成一句話、一串數字,傳給朋友,讓他在十分鐘內體驗你當初的驚喜。對進階玩家來說,種子是「研究素材」:你可以用它來測試遊戲機制、規劃最短路線、甚至反推生成演算法的邏輯。
下次開新世界時,不妨試著做三件事:第一,把種子記下來;第二,觀察出生點附近的結構;第三,把這串數字跟你的體驗一起分享出去。你會發現,原本孤獨的探索,因為一串數字而變成了可以傳遞的風景。
畢竟,在這個由演算法構成的世界裡,種子就是我們與他人共享同一片天空的唯一憑證。同一個種子,同一張地圖——而地圖上的每一個座標,都等著被某個人第一次看見。