Skip to content

Instantly share code, notes, and snippets.

@bolero-MURAKAMI
Last active December 27, 2015 13:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bolero-MURAKAMI/7333428 to your computer and use it in GitHub Desktop.
Save bolero-MURAKAMI/7333428 to your computer and use it in GitHub Desktop.
// ループ用変数を定義
size_t n = end - begin;
size_t s = v.size(); // vは、メンバ変数として保持される、`vector<result_type>`型のシード列オブジェクト
auto m = max(s + 1, n);
// 分布用変数を定義
auto t = (n >= 623) ? 11 : (n >= 68) ? 7 : (n >= 39) ? 5 : (n >= 7) ? 3 : (n - 1) / 2;
auto p = (n - t) / 2;
auto q = p + t;
// 一度目の分布
for (size_t k = s + 1; k < m; ++k) {
auto r1 = 1664525 * T(begin[k%n] ^ begin[(k+p)%n] ^ begin[(k-1)%n]);
auto r2 = r1 +
( k == 0 ? s
: (0 < k) && (k <= s) ? (k%n + v[k-1])
: /*k > s ?*/ k%n
);
begin[(k+p)%n] += r1;
begin[(k+q)%n] += r2;
begin[k%n] = r2;
}
// 二度目の分布
for (size_t k = m; k < m + n; ++k) {
auto r3 = 1566083941 * T(begin[k%n] + begin[(k+p)%n] + begin[(k-1)%n]);
auto r4 = r3 - k%n;
begin[(k+p)%n] ^= r3;
begin[(k+q)%n] ^= r4;
begin[k%n] = r4;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment