用C代码在python中实现noise函数

用C代码在python中实现noise函数,python,procedural-generation,Python,Procedural Generation,我想尝试一下程序性内容生成算法,并决定从噪声(柏林噪声、值等)开始 为此,我想要一个通用的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):

我想尝试一下程序性内容生成算法,并决定从噪声(柏林噪声、值等)开始

为此,我想要一个通用的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
它总是返回-0.281790983863,即使在更高的维度和不同的种子上也是如此

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

我如何纠正这个问题,或者,如果可能的话,如何生成一个伪随机函数,该函数在被植入种子后,对于某个输入总是返回相同的值


[编辑]修复了代码。现在它可以工作了。

其中Hugo Elias引用的代码有:

 x = (x<<13) ^ x
把这个巨大的n变得更大,直到你最终扔掉所有东西,除了最后的31位。这没有多大意义;-)

尝试将代码更改为:

n = (n << 13) ^ n

n=(是的,就是这样。读了这么多数学知识后,我认为这是指数运算。我修复了另一个错误(一个拼写错误),现在它可以工作了。还有,天哪!蒂姆·彼得斯回答了我!
n = (n << 13) ** n
nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff
n = (n << 13) ^ n