1

プロシージャルなコンテンツ生成アルゴリズムを試してみたいので、ノイズ (パーリン、値など) から始めることにしました。

そのために、一般的な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

問題は、計算にあると思います。コードは次の 2 つの記事に基づいています。

私のテストの例:

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

より高い次元や異なるシードであっても、常に -0.281790983863 を返します。

問題は、C/C++ では一部の計算でオーバーフローが発生し、すべてが機能することだと思います。Pythonでは、巨大な数を計算するだけです。

これを修正するにはどうすればよいですか、可能であれば、シードされた後、特定の入力に対して常に同じ値を返す疑似乱数関数を生成するにはどうすればよいですか。

[編集] コードを修正しました。今では動作します。

4

1 に答える 1

2

Hugo Elias からの参照コードの場所:

 x = (x<<13) ^ x

あなたが持っている:

n = (n << 13) ** n

Elias はビットごとの xor を実行していると思いますが、実際には 8192*n をnしています。それはあなたに大きな価値をもたらします。それで

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

最終的に最後の 31 ビット以外のすべてを破棄するまで、その巨大な n をさらに大きくします。あまり意味がありません;-)

コードを次のように変更してみてください。

n = (n << 13) ^ n

そして、それが役立つかどうかを確認してください。

于 2013-10-08T23:51:06.527 に答える