Permuted congruential generator
(32→32ビット)count = (int)(x >> 28); x ^= x >> (4 + count); x *= 277803737u; return x ^ (x >> 22); (64→64ビット)count = (int)(x >> 59); x ^= x >> (5 + count); x *= 12605985483714917081u; return x ^ (x >> 43);
XSL-RR-RR: RXS-M-XSと同様に128ビットの状態から128ビットの状態に変換する。 (128→128ビット)count = (int)(x >> 122); low64 = rotr64((uint64_t)(x ^ (x >> 64)), count); high64 = rotr((uint64_t)(x >> 64), low64 & 63); return (uint128_t)high64 << 64 | low64;
それぞれの変換は元に戻すことができる(つまり全単射)か切り捨てである。したがってそれらを合成したものはある出力が得られる入力の個数は常に同じである。
もし 2 128 {\displaystyle 2^{128}} より長い周期が必要になった場合は複数の生成器を使って拡張することができる。例えば生成器を2つ使う場合、生成器1の出力が0になるごとに生成器2の出力を1つ進めて、最終的な出力は生成器1の出力と生成器2の出力の和とすることでそれぞれの周期の積の周期になる。