gpt4 book ai didi

python - 我是否需要针对 Perlin 噪声定制随机数生成器?

转载 作者:行者123 更新时间:2023-11-30 23:24:57 28 4
gpt4 key购买 nike

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

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

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) 函数会生成一维噪声的随机数。

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

最佳答案

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

如果您可以根据给定的参数重置 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 以外的值时,它也会返回不同的值。 seed 的参数可以是 Python 中的任何可哈希类型。出于您的目的,任何数字类型都可以。

通常,在创建 Perlin 噪声时,会多次调用此Noise 函数,因此您会希望它速度快。在我的机器上,执行上述函数大约需要 14 微秒。每秒大约只有 70000 次调用。实现 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 函数。

Plot of IntNoise

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com