2013-08-03 64 views
1

我發現this algorithm爲16位PRNG。我不明白x,y和t是什麼。我想要做的是使用一個16位的種子來生成多個隨機的16位值。瞭解這16位PRNG

如果我是正確的,該網頁(下面引用)中顯示的函數只是僞代碼,因爲就目前而言,它將始終生成相同的值,因爲x和y是函數的局部變量?

uint16_t rnd_xorshift_32() { 
    static uint16_t x=1,y=1; 
    uint16_t t=(x^(x<<5)); 
    x=y; 
    return y=(y^(y>>1))^(t^(t>>3)); 
} 

如何可以在上面進行修改,以讀取一個全局變量uint_16_t random(將已預先設定了種子),然後用一個隨機值覆蓋它嗎?

編輯:謝謝,所以我對靜態變量的理解已被糾正。我是否正確地說xy最初被設置爲種子(在上面的代碼中都是1),然後被修改爲隨後的隨機值?而t是一個臨時變量?

+1

它們是靜態的。呼叫之間的值保持不變。靜態聲明也只用了一次,所以它從1開始,不再執行,並保留在內存中用於下一次調用。 –

+2

它們是局部變量,但它們沒有自動存儲持續時間 - 「static」表示「x」和「y」始終指向相同的變量實例,它們在函數調用之間持續存在。 – 2013-08-03 12:41:54

+0

C [程序中「靜態」的意思是什麼?](http://stackoverflow.com/questions/572547/what-does-static-mean-in-ac-program) – 2013-08-03 12:42:57

回答

3

變量xy在您暗示的意義上並不是真正的「本地」功能。它們被聲明爲static,這意味着它們的範圍是本地函數(它們不能通過外部名稱訪問),它們的生命週期是整個程序的。所以他們會保留它們之間的值,這意味着兩件事:

  • x和y實際上是PRNG狀態。
  • 該函數不是線程安全的。
+2

C99 6.2.4: 3在一個靜態變量上:「它的生命週期是整個執行」。你的替代形式「從函數的第一次調用開始(不遲於)最後一次」不是更短,也不是更簡單,並且當變量的地址被傳遞並在最後一次調用它所在的函數。 –

+0

謝謝你的引用。在我面前沒有標準,我刻意保守,但你的觀點很好。你知道它在C99之前是否一樣嗎? –

+1

C89中相應的句子是「對象存在並保留 其整個執行整個 程序的最後存儲的值。」 –