Perlin用伪代码解释:http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

本教程为我提供了用伪代码编写的随机数生成器函数。返回范围为(-1,1)的浮点数。

function IntNoise(32-bit integer: x)
    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end IntNoise function


因此,如果此函数返回范围为(-1,1)的数字,我是否只能使用random.uniform(-1, 1)
但是后来我遇到了这个问题:

function Noise(x)
.
.
end function

function SmoothNoise_1D(x)
    return Noise(x)/2  +  Noise(x-1)/4  +  Noise(x+1)/4
end function


我猜想Noise(x)函数会为1D噪声生成随机数。

我似乎无法理解x参数是什么。
是种子吗?而且,我不能使用random.uniform(-1, 1)

最佳答案

Perlin噪声中使用的噪声函数是种子随机数生成器。也就是说,每次使用参数X的相同值调用该函数时,它都必须返回相同的值。您可以将X视为要计算Perlin噪声的区域边界之间给定维度上空间中的某个位置。 。

如果您可以根据给定的参数重置RNG的状态,则可以使用Python随机模块,以便它对于给定的X始终返回相同的值。

import random

rand_state = random.Random()

def Noise(x):
  rand_state.seed(x)
  return rand_state.random()

>>> Noise(1)
0.13436424411240122
>>> Noise(2)
0.9560342718892494
>>> Noise(1)
0.13436424411240122


请注意,Noise在第一次和第二次传递1时返回相同的值。当输入非1的值时,它也会返回一个不同的值。种子的参数可以是Python中的任何可哈希类型。为了您的目的,任何数字类型都可以使用。

通常,在创建Perlin噪波时,会对该噪波函数进行多次调用,因此您希望它更快。在我的机器上,执行上述功能大约需要14微秒。每秒大约只有70万次通话。为IntNoise实现伪代码可能会导致更好的性能。实际上,以下方法:

MAX_INT = (1<<31)-1
def IntNoise(x):
    x = int(x)
    x = ((x << 13) & MAX_INT) ^ x
    x = ( x * (x * x * 15731 + 789221) + 1376312589 ) & MAX_INT
    return 1.0 - x / 1073741824.0


每次调用似乎平均要花费1.6微秒,比上面的“噪声”快10倍。它的返回值范围是(-1,1),但是可以通过修改最后一行来更改。我不能说它的分布均匀,但是,一张图片值一千字。下面的蓝点来自IntNoise,红点来自python random.uniform函数。



您的问题中的平滑噪声算法可以使用上面的噪声函数。您在问题中链接的URL描述了平滑功能比我能提供的更好的功能。阅读该段落后,研究其旁边的1D和2D平滑图片,以更好地了解其目的。

关于python - 我是否需要自定义随机数发生器以消除Perlin噪声?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23178631/

10-12 23:51