我想试试程序化的内容生成算法,并决定从噪声(Perlin、value等)开始
为此,我需要一个通用的n维噪声函数。为此,我编写了一个函数,返回给定维度的噪声生成函数:
small_primes = [1, 83, 97, 233, 61, 127]
def get_noise_function(dimension, random_seed=None):
primes_list = list(small_primes)
if dimension > len(primes_list):
primes_list = primes_list * (dimension / len(primes_list))
rand = random.Random()
if random_seed:
rand.seed(random_seed)
# random.shuffle(primes_list)
rand.shuffle(primes_list)
def noise_func(*args):
if len(args) < dimension:
# throw something
return None
n = [a*b for a, b in zip(args, primes_list)]
n = sum(n)
#n = (n << 13) ** n
n = (n << 13) ^ n
nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff
return 1.0 - (nn / 1073741824.0)
return noise_func
我认为,问题在于计算。我的代码基于以下两篇文章:
我的一个测试示例:
^{pr2}$它总是返回-0.281790983863,即使在更高的维度和不同的种子上。在
问题是,我相信,C/C++中有一些计算是溢出的,一切都是有效的。在python中,它只计算一个巨大的数字。在我该如何纠正这一点,或者,如果可能的话,如何生成一个伪随机函数,该函数在被植入种子之后,对于某个输入总是返回相同的值。在
[编辑]修复了代码。现在它起作用了。在
其中,来自Hugo Elias的参考代码有:
你有:
^{pr2}$我相信Elias在做位异或,而你却有效地将8192*n提高到n的次幂,这给了你巨大的价值。那么
把这个巨大的n变成更大的,直到你最终扔掉除了最后31位以外的所有东西。没什么意义;—)
尝试将代码更改为:
看看这是否有用。在
相关问题 更多 >
编程相关推荐