2013-10-08 61 views
1

我想玩弄程序上的內容生成算法,並決定開始與噪聲(培林,價值等)在Python從C代碼實現噪音的功能

對於這一點,我想有一個通用的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

從哪裏雨果埃利亞斯引用的代碼有:

x = (x<<13)^x 

您有:

n = (n << 13) ** n 

我相信利亞做按位異或,當你有效的提高了8192 * N的電源這給你一個巨大的價值。然後

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

需要的是巨大的n和使它更大,直到你終於扔掉一切,但最後31位。它沒有多大意義;-)

試着改變你的代碼:

n = (n << 13)^n 

,看看是否有幫助。

+0

是的,就是這樣。讀了這麼多的數學後,我認爲這是冪指數。我修復了另一個錯誤(一個錯字),現在它工作。另外,聖潔的廢話!蒂姆彼得斯回答了我的問題! –