地图生成的随机种子函数?


28

我正在寻找一个函数来生成随机的,基于图块的地图,因为地图的视觉边界发生了变化(通过地图)。我希望地图无限大,并具有迷宫般的结构。

但是,如果世界是无限的,那么回到玩家之前所处的位置会带来问题。游戏必须记住那里所有东西的实际外观。

所以,我在想-“我的世界如何解决这个问题?” 我以为自己必须使用某种带有种子的随机数函数,该函数既可以向前又可以向后移动,这样就可以像以前一样完全重新生成旧的图块,但是在新的实例中。

您对此有何想法?


我的答案是+5,但问题仅是+2?这是当前首页上最好的问题之一。

2
我的世界不是简单地存储您已经访问过/修改过的块吗?
FxIII 2011年

@FxIII:我的世界必须,因为您可以修改景观。如果您不能做到这一点,则存储块可能是浪费,或者至少是过度复杂化。

@Joe Wreschnig:好吧,好吧……我担心我错过了非常大的事情!
FxIII

Answers:


20

您注意到的是随机数生成器噪声函数之间的区别。每次您呼叫随机数发生器时,它都会吐出一个不同的数字。噪声函数接受一些自变量(例如,映射x和y),并吐出具有类似随机统计特性的数字,但是每次对相同自变量使用相同的值,即它是适当的数学函数。

两者是密切相关的。噪声函数可以通过每次传入一个不同的值(例如noise(1)noise(2)等等)来模拟随机数生成器。转储到巨型表中的随机数生成器可以充当噪声函数。但是,在两种情况下,您都使用了错误的工具来完成工作。

Minecraft特别使用Perlin噪声Perlin噪声是一种计算成本低的噪声,并具有在所需的任意多个维度上连续的理想特性-如果绘制f(x)f(x + 1),则不会有突然的跳跃。这对于纹理调制,体积云和气体以及地形生成等许多事情非常有用。

如果您正在寻找开始使用的实现,则Ken Perlin改进的Perlin噪声发生器是最简单的实现之一。


3
请注意,许多随机数生成器都使用种子,并且会在给定相同种子的情况下生成同一组数字。
thedaian 2011年

3
@thedaian:在这种情况下这不是特别有用,除非您想重新生成每个数字。噪声函数可让您获得第500个数字,而无需在此之前生成499。

给定Perlin Noise算法,是否可以对其进行校准?考虑一下,我希望该算法更有可能生成一堆墙砖,然后再生成一堆空间砖。
Mathias Lykkegaard Lorenzen 2011年

3
您没有阅读并理解我六分钟内给出的链接。

1
答案可能与Notch的博客帖子一样完整:notch.tumblr.com/post/3746989361/terrain-generation-part-1
deceleratedcaviar

3

Minecraft控制其生成方式的方式是创建一个关卡种子,该种子用于为游戏的所有随机数生成提供种子。如果在请求时磁盘上不存在任何块,则将根据该级别的种子使用Notch的生成函数来生成该块;然后保存到磁盘以供以后使用。

听起来您正在寻求实现类似的行为,所以这是一种安全的方法。


2

正如Joe指出的那样,您正在寻找哈希函数。通常,随机函数只是散布有最后返回数字的散列函数。因此,如果Random()返回Hash(seed)=1234,则第二个调用Random()将返回Hash(1234),依此类推。

如果您正在寻找用于伪随机数的简单哈希函数,请查看MurMurHash。我已经在C#中实现了它,如果您有兴趣,可以将其发布到某个地方。柏林噪声的更详细的信息,使用这种散列函数,可以在这里找到这里,并在C#中的实现是在这里

所有这些信息都来自一个问题,我问一年前在这里对堆栈溢出。您正在寻找的是过程内容生成,因此,如果您需要更多信息,请进行搜索。产生快乐的地形!


-1。实际上,Perlin noise的散列与MMH或其他加密散列例程中使用的技术没有相似之处。C#代码是垃圾,似乎只是在随机值之间进行线性插值;它比适当的Perlin噪音需要更多的内存,并且运行速度可能较慢。

1
@Joe-对不起,您对Perlin Noise的实现感到如此强烈。Perlin Noise本身就是将哈希函数转换为连续噪声函数的概念。我已经使用MurMurHash非常有效地生成了很多Perlin Noise。对于C#代码,这是一个示例,说明如何以编程方式确定2D Perlin Noise中单个点的值。我永远不会在生产中使用它,但我认为它比您发布的代码更容易理解。
dlras2 2011年

1
OP不了解杂点或哈希,因此我只是尝试提供参考,希望他们进一步调查并自行决定如何实施所需的操作。
dlras2 2011年

“ Perlin Noise本身就是将哈希函数转换为连续噪声函数的概念。” 不,Perlin噪声是Ken Perlin发明的连续噪声函数之一(而不是他称为“简单噪声”的函数)。并非所有的连续噪声功能都是Perlin噪声。并非所有的连续噪声函数都甚至是梯度噪声,其中Perlin噪声就是一个特定示例;您链接的不是梯度噪声,而是价值噪声。

您的链接中的代码“更容易遍历”,因为它不是Perlin的杂物。它不那么顺利;它使用更多的资源;简而言之,它很笨重,因此更容易通过。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.