我需要定制伯林噪声随机数发生器吗?

2024-05-16 00:39:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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)? 但后来我遇到了一个问题:

^{pr2}$

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

我似乎不明白x参数是什么。 是种子吗?我不能用random.uniform(-1, 1)


Tags: 函数代码httpnetmodelsfunctionrandomuniform
1条回答
网友
1楼 · 发布于 2024-05-16 00:39:35

在Perlin噪声中使用的噪声函数是一个种子随机数发生器。也就是说,每次调用它时,它必须返回相同的值,参数X。你可以把X看作是空间中某个给定维度上的某个位置,在计算Perlin噪声的区域边界之间。在

如果可以根据给定的参数重置RNG的状态,那么可以使用Python random模块,以便它始终为给定的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

注意,当第一次传递1时,Noise返回相同的值,第二次。当输入的值不是1时,它也返回一个不同的值。在Python中,seed的参数可以是任何散列类型。就您的目的而言,任何数字类型都是有效的。在

通常,在创建Perlin noise时,会对这个noise函数进行许多调用,因此您希望它速度更快。在我的机器上,执行上面的函数大约需要14微秒。每秒只有大约70000个电话。实现IntNoise的伪代码可能会导致更好的性能。事实上,以下方法:

^{pr2}$

每次调用的平均时间大约是1.6微秒,或者比上面的噪声快10倍。它的返回值范围是(-1,1),但可以通过修改最后一行来更改。我不能说它分布的均匀性,然而,一幅画胜过千言万语。下面的蓝点来自IntNoise,红点来自python随机.均匀功能。在

Plot of IntNoise

上面的噪声函数可由平滑噪声算法在您的问题中使用。你在问题中链接的URL描述了平滑函数比我做的更好。读了这段之后,研究旁边的1D和2D平滑的图片,以更好地理解它们的目的。在

相关问题 更多 >