线性同余法产生均匀随机数C语言,利用线性同余法产生随机数进行同步计算
隨機數使用場景
主要適用于偽隨機環境下的同步計算:
場景一:服務端要校驗客戶端數據,服務端和客戶端公用一個隨機數種子,使每一步產生相同的隨機數,服務端校驗客戶端產生的結果;
場景二:不同服務器環境下對于相同種子的偽隨機同步;
場景三:……
參考文獻
核心思想
主要是利用線性同余思想來進行隨機數生成設計,摒棄平臺間的參數不同造成相同種子產生偽隨機數值不一樣的情況。
線性同余容易理解,容易實現,而且速度快。算法數學上基于公式:X(n+1) = (a * X(n) + c) % m,其中:
模m, m > 0
系數a, 0 < a < m
增量c, 0 <= c < m
原始值(種子) 0 <= X(0) < m
參數c, m, a比較敏感,或者說直接影響了偽隨機數產生的質量,不同的編譯環境對參數取值均不一致,在WiKi上已有資料。
一些代碼
/**
* @brief 同步偽隨機類,主要跨平臺根據同樣的seed計算出一致的隨機結果
*
* @warn 暫時沒考慮多線程場景
*/
class SyncRand
{
//算法數學模型 X(n+1) = (a * X(n) + c) % m ,參數選取參考gcc
#define SR_A ((uint64_t)1103515245)
#define SR_C ((uint64_t)12345)
#define SR_M ((uint64_t)1<<32)
public:
SyncRand(uint64_t seed) : Xn(seed) {}
~SyncRand() {}
uint32_t rand() {
Xn = ((SR_A * Xn + SR_C) % SR_M);
return Xn;
}
private:
uint64_t Xn;
};
測試用例:
int main()
{
SyncRand sr(time(NULL));
for (int i = 0; i < 1000000; i++) {
printf("%u\n", (sr.rand() % 10000));
}
return 0;
}
//用來查看萬分比概率分布
//[xxx]$./test | awk '{a[$1]++}END{for(k in a) print k,a[k]}' | sort -k1 -g
總結
以上是生活随笔為你收集整理的线性同余法产生均匀随机数C语言,利用线性同余法产生随机数进行同步计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: diyupload插件:批量图片上传
- 下一篇: 计算机初级培训 ppt,《计算机初级培训