From 1ee85235b444488df0f1543cba7c7bf299b44007 Mon Sep 17 00:00:00 2001 From: Shuhao Zhang Date: Wed, 30 Dec 2020 20:49:40 +0800 Subject: [PATCH] feat(random): add lagged fibonacci generator code --- docs/misc/random.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/misc/random.md b/docs/misc/random.md index 9f22fc3c..8a72c5b2 100644 --- a/docs/misc/random.md +++ b/docs/misc/random.md @@ -227,7 +227,7 @@ $$ } ``` -#### 时滞斐波那契生成器 +#### 时滞斐波那契随机数生成器 利用下式来生成随机数序列 $\{R_i\}$(其中 $0 < j < k$): @@ -239,6 +239,37 @@ $$ 该方法较传统的线性同余随机数生成器而言,拥有更长的周期,但随机性受初始条件影响较大。 +??? note "参考实现" + ```cpp + #include + #include + using namespace std; + struct myrand { + vector vec; + int l, j, k, cur; + myrand(int l, int j, int k) { + this->l = l; + this->j = j; + this->k = k; + cur = 0; + for (int i = 0; i < l; i++) { + vec.push_back(rand()); // 先用其他方法生成随机序列中的前几个元素 + } + } + unsigned next() { + vec[cur] = vec[(cur - j + l) % l] * vec[(cur - k + l) % l]; + // 这里用 unsigned 类型是为了实现自动对 2^32 取模 + return vec[cur++]; + } + }; + myrand rnd(11, 4, 7); + int main() { + unsigned x = rnd.next(); + cout << x << endl; + return 0; + } + ``` + ## 参考资料与注释 [^ref1]: [Don't use rand(): a guide to random number generators in C++](https://codeforces.com/blog/entry/61587) -- 2.11.0