从C代码实现python中的噪声函数

时间:2013-10-08 22:38:10

标签: python procedural-generation

我想玩程序内容生成算法,并决定从噪音开始(Perlin,值等)

为此,我想要一个通用的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

我认为,这个问题与计算有关。我的代码基于这两篇文章:

我的一个测试示例:

f1 = get_noise_function(1, 10)
print f1(1)
print f1(2)
print f1(3)
print f1(1)

它总是返回-0.281790983863,即使是在更高的维度和不同的种子上。

我认为问题在于,在C / C ++中,存在溢出是一些计算,一切正常。在python中,它只是计算一个巨大的数字。

如何更正此问题,或者如果可能的话,如何生成伪随机函数,在播种后,对于某个输入始终返回相同的值。

[编辑]修正了代码。现在它有效。

1 个答案:

答案 0 :(得分:2)

Hugo Elias的引用代码有:

 x = (x<<13) ^ x
你有:

n = (n << 13) ** n

我相信Elias正在做按位xor,而你有效地将8192 * n提升到n的 power 。这给了你巨大的价值。然后

nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff

取出那个巨大的n并使它变得更大,直到最后扔掉除了最后31位之外的所有东西。它没有多大意义; - )

尝试将代码更改为:

n = (n << 13) ^ n

看看是否有帮助。