2011-10-12 35 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