2011-10-12 54 views
4

我試圖生成無限的隨機地形。每次給定相同的種子時,地形應產生相同的結果。二維噪聲生成的參數隨機函數

我試過使用Java的隨機函數,使用地形網格上給定節點的x和y座標的各種函數創建種子。如x * y + x + y +種子,20 * x + 30 * y等

這種方法的問題是我總是看到生成的數字中有清晰的模式。

所以基本上我想要的是: F(X,Y)=隨機數

這將是有益的,如果上述功能可能包括某種形式的種子,使其: F(X,Y ,種子)=隨機數

我需要爲每個x,y組合生成幾個數字,但是一旦我具有上述功能,應該很容易就可以獲得更多數字。這些將決定地形的高度,以及將出現什麼特徵(建築物,樹木)。

請不要提及佩林噪音或其他此類方法。我的問題不是讓噪音看起來不錯,而是獲得可靠的「隨機」噪音。

謝謝, 傑米。

+0

你看在Java中產生的數字圖案清晰.util.Random?小心詳細說明這些模式是什麼? – corsiKa

+0

地形上有圖案,水平和垂直重複。 – JamieEclipse

+0

您可以上傳這些模式的示例以及生成它們的代碼嗎?我對它很感興趣;這也是我的愛好之一。 (曾經是我曾在一家曾經工作過的研究公司做過的事情。) – corsiKa

回答

5

您正在尋找哈希函數。嚐嚐其中:

http://www.concentric.net/~ttwang/tech/inthash.htm

這裏的用法示例:

int hash32shift(int key) 
{ 
    key = ~key + (key << 15); // key = (key << 15) - key - 1; 
    key = key^(key >>> 12); 
    key = key + (key << 2); 
    key = key^(key >>> 4); 
    key = key * 2057; // key = (key + (key << 3)) + (key << 11); 
    key = key^(key >>> 16); 
    return key; 
} 

int noise(int x, int y, int seed) 
{ 
    return hash32shift(seed+hash32shift(x+hash32shift(y))); 
} 

而且,它看起來像這樣:

noise

+0

我一回到家就試試,非常感謝。在我將它粘貼之前,我將不得不研究java操作符,「>>>」的存在讓我大開眼界。 – JamieEclipse

+0

我使用了隨機函數,所以現在每個節點都有一系列隨機數。 :D爲了避免一些混淆,我認爲重複可能部分(但不是完全)歸因於我寫的錯誤字典查找函數。然而,這隻會解釋一些對稱性,而不是重複。 – JamieEclipse