我正在閱讀一本解釋 xorshift 演算法的書(我知道,基本的東西)。然后,在互聯網上進行更多搜索時,我發現所有基本示例似乎都將位向右/向左移動相同的“數量”(13、17、5)。
例如:
struct xorshift32_state {
uint32_t a;
};
uint32_t xorshiftTransform(struct xorshift32_state *state) {
uint32_t x = state->a;
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return state->a = x;
}
13他們在所有示例中使用,17和是否有特殊原因5?是的,我也找到了其他例子,但是這個例子不斷重復,我不知道數字選擇是否微不足道。
uj5u.com熱心網友回復:
這實際上比您想象的要微妙和有趣!
xorshift 亂數生成器有一個有趣的理論背景。移位和異或的使用對應于執行矩陣向量乘積,其中矩陣和向量都由 0 和 1 組成。所討論的特定矩陣是根據班次大小的選擇和這些班次的方向推匯出來的。
為了使 RNG 表現良好(特別是在生成所有可能值之前不重復任何輸出),由移位匯出的矩陣必須是可逆的。大多數班次選擇不會給出可逆矩陣,xorshift 的作者運行計算機搜索以找到所有可能的班次大小。在詳細介紹 xorshift 系列 RNG 的論文中,作者詳細介紹了您提到的移位的具體選擇,并說如下:
它使用我最喜歡的選擇之一,[a, b, c] = [13, 17, 5],并且將通過幾乎所有的隨機性測驗,除了 Diehard [2] 中的二元秩測驗。(長周期 xorshift RNG 必然使用非奇異矩陣變換,因此每個連續的 n 個向量必須是線性獨立的,而真正隨機的二進制向量只有大約 30% 的時間是線性獨立的。)雖然我只測驗了其中的幾個,以上 648 種選擇中的任何一種都可能提供非常快速、簡單、高質量的 RNG。
所以從某種意義上說,這些數字滿足了數學運算所需的理論必要條件,使其成為一個好的 RNG,作者對其進行了測驗并在原始論文中將它們單獨列出,這就是為什么我猜測它們是如此廣泛使用。但也許有一個更好的選擇,使用人們還沒有開始使用的論文中的其他數字?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/446424.html
下一篇:使復雜性更小(更好)
