在解決旅行商問題(TSP)時,需對 500+ 節點進行 3-opt 交換優化,要求隨機選取 1/3 以上節點。標準庫 rand() 速度嚴重不足,且受限於無法使用 Boost 等第三方庫,需尋找純標準庫實現的高性能隨機數生成器。
George Marsaglia 發明的 Xorshift 通過「異或 + 位移」操作生成下一數值,屬於線性反饋移位寄存器(LFSR)子類。特點:
static unsigned long x = 123456789, y = 362436069, z = 521288629;
unsigned long xorshf96(void) { // period 2^96-1
unsigned long t;
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
}
適用場景:通用隨機採樣、遊戲邏輯、模擬退火、遺傳算法等對統計分布要求不極嚴格的高性能場景。
已知缺陷:生成二進制矩陣時奇異矩陣分布異常,無法通過 TestU01 BigCrush 的 MatrixRank 和 LinearComp 測試。
#include <cstdint>
// 狀態變量必須非全零初始化
uint32_t x, y, z, w;
uint32_t xorshift128(void) {
uint32_t t = x ^ (x << 11);
x = y; y = z; z = w;
return w = w ^ (w >> 19) ^ t ^ (t >> 8);
}
// xorshift128+ 版本(加入非線性步驟,統計特質大幅提升)
uint64_t s[2]; // 128-bit 狀態
uint64_t xorshift128plus(void) {
uint64_t s1 = s[0];
uint64_t s0 = s[1];
s[0] = s0;
s1 ^= s1 << 23; // a
s[1] = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26); // b, c
return s[1] + s[0];
}
xorshift128+ 在 x86 上生成一個 64-bit 隨機數僅需 <10 時鐘週期,且 BigCrush 失敗次數比 Mersenne Twister、WELL 算法少一個數量級,是非加密場景下的最佳選擇。
xorshf96 或 xorshift128xorshift128+ 或 xorshift1024*<random> 或專用加密庫std::chrono::high_resolution_clock 或硬體熵源