當前位置:編程學習大全網 - 編程語言 - MC世界種子的原理是什麽?不都是隨機的嗎?壹串數字怎麽能描述那麽大的數據量?

MC世界種子的原理是什麽?不都是隨機的嗎?壹串數字怎麽能描述那麽大的數據量?

地圖種子的原理是:地圖生產是實時,隨機,可重現的

在相同版本的minecraft裏,相同的種子生成的地圖是壹樣的

地圖生產的細節:

種子:intseed = hashcode(xxxx);(這也是為什麽中文也可以生產地圖的原因)

動態生產地圖的公式是。

map = fun_map(intseed) = fun_天空(intseed)+ fun_地形(intseed) + fun_方塊(intseed) + fun_建築(intseed) + fun_生物(intseed) + fun_礦物(intseed)

舉個栗子:

生成地圖函數:f(c)

如果f是壹個確定的函數,那麽對於同樣的c值,f(c)的值壹定是確定的。

c就是那個種子,f(c)就是生成的地圖。

地圖生成使用的隨機函數,當然是「偽隨機函數」

什麽是「偽隨機函數」?計算機進行的是確定性運算,不存在真正的隨機性,這意味著想要求計算機「獨立」(依靠外部輸入“例如磁盤存取、鍵盤鼠標操作等”來獲得熵源的隨機數發生器不在討論範圍之內。)生成真正的隨機數,在理論上不可能。許多編程應用中想要隨機效果,使用的都是「偽隨機函數」,就是用某種非常復雜的算法,來生成壹系列看似毫無關聯卻又均勻分布的數字(例如 0.9024310185642406, 0.6399798616249142, 0.8728940712975358, ...),稱為「偽隨機數列」,以此來模擬隨機的效果。每次程序調用這個偽隨機函數的時候,就從這個數列中取出下壹個數字返回給程序。這樣做在孤立來看是沒問題的,但是問題是如果妳把程序關閉,重新啟動運行,妳得到的還是原來那個數列,每次取隨機數取出來的還是跟上次壹樣的那些數字,例如仍然是「0.9024310185642406, 0.6399798616249142, 0.8728940712975358, ...」。如果妳依賴這個數列來生成遊戲內容,那麽每次遊戲所得到的的結果都會壹樣,這就失去了隨機的意義。

為了解決這個問題,我們只能從「偽隨機函數」外面給它加入某種「擾動」,讓它在每次運行的時候結果不壹樣,產生不同的「偽隨機數列」。「種子」就是最常見的壹種擾動方式。相同的「種子」產生相同的數列,不同的種子產生不同的數列。如何保證每次運行的「種子」不相同呢?最簡單的辦法就是采用「系統時間」作為種子。相同的程序,上次運行和這次運行的時間肯定不壹樣,這就確保了每次的種子不同。當然,如果妳人為去修改系統時間,並且讓兩次運行時的系統時間嚴格壹致,那麽還是會得到相同的運算結果。但是作為遊戲來說,壹般沒必要考慮這些。

Minecraft 裏面的地圖種子就是這樣的原理。地圖本質上是「偽隨機函數」生成的,跟別的遊戲沒什麽區別,但是我們知道 Minecraft 是個比較 geeky 的遊戲,它把種子的控制權交給妳,允許妳指定種子,那麽當妳使用相同的種子的時候,遊戲中所有本該「隨機」的元素都會變成「命中註定」。不僅生成的地形完全相同,連什麽地方會刷出什麽花草牛羊都壹樣。如果玩家的玩法操作也完全嚴格相同的話(這個不太可能),那麽整個遊戲完全就等於是在放電影,壹切都是預定好的。

另外,在minecraft裏,地形生成、建築生成、礦物生成是分開的,如果安裝了生成建築或者礦物mod,並不會幹擾特定種子的形成特定的地形。

  • 上一篇:怎樣在Qt下連接讀寫sqlite數據庫
  • 下一篇:大廠的Mac編程
  • copyright 2024編程學習大全網