2012-07-21 53 views
1

下面的僞代碼如何轉化爲Python?僞碼解釋

function IntNoise(32-bit integer: x)    

    x = (x<<13)^x; 
    return (1.0 - ((x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff)/1073741824.0);  

end IntNoise function 

我不確定以下幾項:IntNoise調用中'32位整數:x'參數;在「< <」和「& 7FFFFFFF」

功能是從這個網頁http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

+0

僅供參考,python有一個內置的隨機數生成器:http://docs.python.org/library/random。html – Eugene 2012-07-21 20:19:46

+1

s/function/def /,s/IntNoise/int_noise /,s/32位整數://,在第一行末尾添加一個冒號,前置0x至7fffffff,放棄最後一個(「結束」)線。 – 2012-07-21 20:21:03

回答

2

一行行,這裏的變化:

  1. function IntNoise(32-bit integer: x)

    我們並不需要聲明的參數類型,以及不喜歡使用首字母大寫,所以一行是:

    def intnoise(x): 
    
  2. 下一行的唯一錯誤是分號。刪除它,我們得到:

    x = (x << 13)^x 
    

    x是左移 13位,那麼結果會按位異或 -ed與x的初始值。

  3. 在下一行,再次沒有分號,而7ffffff需要與0x前綴,即:

    return (1.0 - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff)/1073741824.0) 
    

總之,這使得:

def intnoise(x): 
    x = (x << 13)^x 
    return (1.0 - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff)/1073741824.0) 
+0

非常有趣。如果您不熟悉按位操作,那麼僞代碼確實顯得相當混亂。特別是如果將'^'讀作'**'。謝謝。 – Naaaysmith 2012-07-21 21:11:14

+0

分號是合法的,不會改變Python版本的含義,但它肯定不是慣用的。 – 2012-07-22 07:21:34

1

的「32位整數」部分的隨機數發生器不,除非你使用numpy.int32。只要有意義,將值掩蓋到32位。

「< <」代表。

「& 7fffffff」需要轉換。 「&」代表,但十六進制文字需要一點:0x7fffffff

0

從您的代碼我明白了,功能IntNoise需要32-bit integer作爲輸入。我所知道的<<是左移運算符。並將數字的位向左移動13次。 ^是指數。 7fffffff必須是以十六進制格式表示的數字。它是8位數字,每個數字即f和7佔用4位。 f是十六進制中的15的值。

1

作爲一種學習練習 - 很好,但是一旦你理解了它,只需使用os.urandom(4)作爲隨機數,或者使用random中的函數來處理各種僞隨機生成器。

+0

'os.urandom()'可能是矯枉過正的,因爲OP使用非常弱的LCPRNG開始,並沒有說明他爲什麼使用它(但downvote不是我的)。即使引用的文章也不太清楚PRNG在做什麼。 – msw 2012-07-21 20:35:45

+0

-1的解釋:不幸的是,這個問題與隨機數無關(儘管「隨機數」在鏈接的URL中使用不正確)。只有如何確定性地從種子中產生足夠多的僞隨機數。從操作系統獲取熵用作種子與使用用戶提供的種子相反。 – ninjagecko 2012-07-21 20:40:46