【问题标题】:Implementing noise function in python from C code从C代码在python中实现噪声函数
【发布时间】:2013-10-08 22:38:09
【问题描述】:

我想尝试一下程序化内容生成算法,并决定从噪声(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中,它只是计算一个巨大的数字。

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

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

【问题讨论】:

    标签: python procedural-generation


    【解决方案1】:

    Hugo Elias 引用的代码在哪里:

     x = (x<<13) ^ x
    

    你有:

    n = (n << 13) ** n
    

    我相信 Elias 正在执行按位异或,而您实际上是将 8192*n 提高到 n 的 。这给了你巨大的价值。那么

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

    把那个巨大的 n 变得更大,直到你最终扔掉除了最后 31 位之外的所有东西。这没有多大意义;-)

    尝试将您的代码更改为:

    n = (n << 13) ^ n
    

    看看是否有帮助。

    【讨论】:

    • 是的,就是这样。在阅读了这么多数学之后,我认为这是幂运算。我修复了另一个错误(错字),现在它可以工作了。还有,天哪!蒂姆·彼得斯回答了我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多