19119bafbSConrad Meyer /* 29119bafbSConrad Meyer * PCG Random Number Generation for C. 39119bafbSConrad Meyer * 49119bafbSConrad Meyer * Copyright 2014-2019 Melissa O'Neill <oneill@pcg-random.org>, 59119bafbSConrad Meyer * and the PCG Project contributors. 69119bafbSConrad Meyer * 79119bafbSConrad Meyer * SPDX-License-Identifier: (Apache-2.0 OR MIT) 89119bafbSConrad Meyer * 99119bafbSConrad Meyer * Licensed under the Apache License, Version 2.0 (provided in 109119bafbSConrad Meyer * LICENSE-APACHE.txt and at http://www.apache.org/licenses/LICENSE-2.0) 119119bafbSConrad Meyer * or under the MIT license (provided in LICENSE-MIT.txt and at 129119bafbSConrad Meyer * http://opensource.org/licenses/MIT), at your option. This file may not 139119bafbSConrad Meyer * be copied, modified, or distributed except according to those terms. 149119bafbSConrad Meyer * 159119bafbSConrad Meyer * Distributed on an "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, either 169119bafbSConrad Meyer * express or implied. See your chosen license for details. 179119bafbSConrad Meyer * 189119bafbSConrad Meyer * For additional information about the PCG random number generation scheme, 199119bafbSConrad Meyer * visit http://www.pcg-random.org/. 209119bafbSConrad Meyer */ 219119bafbSConrad Meyer 229119bafbSConrad Meyer /* 239119bafbSConrad Meyer * This code is derived from the canonical C++ PCG implementation, which 249119bafbSConrad Meyer * has many additional features and is preferable if you can use C++ in 259119bafbSConrad Meyer * your project. 269119bafbSConrad Meyer * 279119bafbSConrad Meyer * Much of the derivation was performed mechanically. In particular, the 289119bafbSConrad Meyer * output functions were generated by compiling the C++ output functions 299119bafbSConrad Meyer * into LLVM bitcode and then transforming that using the LLVM C backend 309119bafbSConrad Meyer * (from https://github.com/draperlaboratory/llvm-cbe), and then 319119bafbSConrad Meyer * postprocessing and hand editing the output. 329119bafbSConrad Meyer * 339119bafbSConrad Meyer * Much of the remaining code was generated by C-preprocessor metaprogramming. 349119bafbSConrad Meyer */ 359119bafbSConrad Meyer 369119bafbSConrad Meyer #ifndef PCG_VARIANTS_H_INCLUDED 379119bafbSConrad Meyer #define PCG_VARIANTS_H_INCLUDED 1 389119bafbSConrad Meyer 39*8a0edc91SConrad Meyer #if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__ 409119bafbSConrad Meyer typedef __uint128_t pcg128_t; 419119bafbSConrad Meyer #define PCG_128BIT_CONSTANT(high,low) \ 429119bafbSConrad Meyer ((((pcg128_t)high) << 64) + low) 439119bafbSConrad Meyer #define PCG_HAS_128BIT_OPS 1 44*8a0edc91SConrad Meyer #else 45*8a0edc91SConrad Meyer #define PCG_HAS_128BIT_OPS 0 469119bafbSConrad Meyer #endif 479119bafbSConrad Meyer 48*8a0edc91SConrad Meyer #ifdef __cplusplus 499119bafbSConrad Meyer extern "C" { 509119bafbSConrad Meyer #endif 519119bafbSConrad Meyer 529119bafbSConrad Meyer /* 539119bafbSConrad Meyer * Rotate helper functions. 549119bafbSConrad Meyer */ 559119bafbSConrad Meyer 569119bafbSConrad Meyer inline uint8_t pcg_rotr_8(uint8_t value, unsigned int rot) 579119bafbSConrad Meyer { 589119bafbSConrad Meyer /* Unfortunately, clang is kinda pathetic when it comes to properly 599119bafbSConrad Meyer * recognizing idiomatic rotate code, so for clang we actually provide 609119bafbSConrad Meyer * assembler directives (enabled with PCG_USE_INLINE_ASM). Boo, hiss. 619119bafbSConrad Meyer */ 62*8a0edc91SConrad Meyer #if PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) 63*8a0edc91SConrad Meyer __asm__ ("rorb %%cl, %0" : "=r" (value) : "0" (value), "c" (rot)); 649119bafbSConrad Meyer return value; 659119bafbSConrad Meyer #else 669119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 7)); 679119bafbSConrad Meyer #endif 689119bafbSConrad Meyer } 699119bafbSConrad Meyer 709119bafbSConrad Meyer inline uint16_t pcg_rotr_16(uint16_t value, unsigned int rot) 719119bafbSConrad Meyer { 72*8a0edc91SConrad Meyer #if PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) 73*8a0edc91SConrad Meyer __asm__ ("rorw %%cl, %0" : "=r" (value) : "0" (value), "c" (rot)); 749119bafbSConrad Meyer return value; 759119bafbSConrad Meyer #else 769119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 15)); 779119bafbSConrad Meyer #endif 789119bafbSConrad Meyer } 799119bafbSConrad Meyer 809119bafbSConrad Meyer inline uint32_t pcg_rotr_32(uint32_t value, unsigned int rot) 819119bafbSConrad Meyer { 82*8a0edc91SConrad Meyer #if PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) 83*8a0edc91SConrad Meyer __asm__ ("rorl %%cl, %0" : "=r" (value) : "0" (value), "c" (rot)); 849119bafbSConrad Meyer return value; 859119bafbSConrad Meyer #else 869119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 31)); 879119bafbSConrad Meyer #endif 889119bafbSConrad Meyer } 899119bafbSConrad Meyer 909119bafbSConrad Meyer inline uint64_t pcg_rotr_64(uint64_t value, unsigned int rot) 919119bafbSConrad Meyer { 92*8a0edc91SConrad Meyer #if 0 && PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) 939119bafbSConrad Meyer /* For whatever reason, clang actually *does* generate rotq by 949119bafbSConrad Meyer itself, so we don't need this code. */ 95*8a0edc91SConrad Meyer __asm__ ("rorq %%cl, %0" : "=r" (value) : "0" (value), "c" (rot)); 969119bafbSConrad Meyer return value; 979119bafbSConrad Meyer #else 989119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 63)); 999119bafbSConrad Meyer #endif 1009119bafbSConrad Meyer } 1019119bafbSConrad Meyer 1029119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 1039119bafbSConrad Meyer inline pcg128_t pcg_rotr_128(pcg128_t value, unsigned int rot) 1049119bafbSConrad Meyer { 1059119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 127)); 1069119bafbSConrad Meyer } 1079119bafbSConrad Meyer #endif 1089119bafbSConrad Meyer 1099119bafbSConrad Meyer /* 1109119bafbSConrad Meyer * Output functions. These are the core of the PCG generation scheme. 1119119bafbSConrad Meyer */ 1129119bafbSConrad Meyer 1139119bafbSConrad Meyer /* XSH RS */ 1149119bafbSConrad Meyer 1159119bafbSConrad Meyer inline uint8_t pcg_output_xsh_rs_16_8(uint16_t state) 1169119bafbSConrad Meyer { 1179119bafbSConrad Meyer return (uint8_t)(((state >> 7u) ^ state) >> ((state >> 14u) + 3u)); 1189119bafbSConrad Meyer } 1199119bafbSConrad Meyer 1209119bafbSConrad Meyer inline uint16_t pcg_output_xsh_rs_32_16(uint32_t state) 1219119bafbSConrad Meyer { 1229119bafbSConrad Meyer return (uint16_t)(((state >> 11u) ^ state) >> ((state >> 30u) + 11u)); 1239119bafbSConrad Meyer } 1249119bafbSConrad Meyer 1259119bafbSConrad Meyer inline uint32_t pcg_output_xsh_rs_64_32(uint64_t state) 1269119bafbSConrad Meyer { 1279119bafbSConrad Meyer 1289119bafbSConrad Meyer return (uint32_t)(((state >> 22u) ^ state) >> ((state >> 61u) + 22u)); 1299119bafbSConrad Meyer } 1309119bafbSConrad Meyer 1319119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 1329119bafbSConrad Meyer inline uint64_t pcg_output_xsh_rs_128_64(pcg128_t state) 1339119bafbSConrad Meyer { 1349119bafbSConrad Meyer return (uint64_t)(((state >> 43u) ^ state) >> ((state >> 124u) + 45u)); 1359119bafbSConrad Meyer } 1369119bafbSConrad Meyer #endif 1379119bafbSConrad Meyer 1389119bafbSConrad Meyer /* XSH RR */ 1399119bafbSConrad Meyer 1409119bafbSConrad Meyer inline uint8_t pcg_output_xsh_rr_16_8(uint16_t state) 1419119bafbSConrad Meyer { 1429119bafbSConrad Meyer return pcg_rotr_8(((state >> 5u) ^ state) >> 5u, state >> 13u); 1439119bafbSConrad Meyer } 1449119bafbSConrad Meyer 1459119bafbSConrad Meyer inline uint16_t pcg_output_xsh_rr_32_16(uint32_t state) 1469119bafbSConrad Meyer { 1479119bafbSConrad Meyer return pcg_rotr_16(((state >> 10u) ^ state) >> 12u, state >> 28u); 1489119bafbSConrad Meyer } 1499119bafbSConrad Meyer 1509119bafbSConrad Meyer inline uint32_t pcg_output_xsh_rr_64_32(uint64_t state) 1519119bafbSConrad Meyer { 1529119bafbSConrad Meyer return pcg_rotr_32(((state >> 18u) ^ state) >> 27u, state >> 59u); 1539119bafbSConrad Meyer } 1549119bafbSConrad Meyer 1559119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 1569119bafbSConrad Meyer inline uint64_t pcg_output_xsh_rr_128_64(pcg128_t state) 1579119bafbSConrad Meyer { 1589119bafbSConrad Meyer return pcg_rotr_64(((state >> 35u) ^ state) >> 58u, state >> 122u); 1599119bafbSConrad Meyer } 1609119bafbSConrad Meyer #endif 1619119bafbSConrad Meyer 1629119bafbSConrad Meyer /* RXS M XS */ 1639119bafbSConrad Meyer 1649119bafbSConrad Meyer inline uint8_t pcg_output_rxs_m_xs_8_8(uint8_t state) 1659119bafbSConrad Meyer { 1669119bafbSConrad Meyer uint8_t word = ((state >> ((state >> 6u) + 2u)) ^ state) * 217u; 1679119bafbSConrad Meyer return (word >> 6u) ^ word; 1689119bafbSConrad Meyer } 1699119bafbSConrad Meyer 1709119bafbSConrad Meyer inline uint16_t pcg_output_rxs_m_xs_16_16(uint16_t state) 1719119bafbSConrad Meyer { 1729119bafbSConrad Meyer uint16_t word = ((state >> ((state >> 13u) + 3u)) ^ state) * 62169u; 1739119bafbSConrad Meyer return (word >> 11u) ^ word; 1749119bafbSConrad Meyer } 1759119bafbSConrad Meyer 1769119bafbSConrad Meyer inline uint32_t pcg_output_rxs_m_xs_32_32(uint32_t state) 1779119bafbSConrad Meyer { 1789119bafbSConrad Meyer uint32_t word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u; 1799119bafbSConrad Meyer return (word >> 22u) ^ word; 1809119bafbSConrad Meyer } 1819119bafbSConrad Meyer 1829119bafbSConrad Meyer inline uint64_t pcg_output_rxs_m_xs_64_64(uint64_t state) 1839119bafbSConrad Meyer { 1849119bafbSConrad Meyer uint64_t word = ((state >> ((state >> 59u) + 5u)) ^ state) 1859119bafbSConrad Meyer * 12605985483714917081ull; 1869119bafbSConrad Meyer return (word >> 43u) ^ word; 1879119bafbSConrad Meyer } 1889119bafbSConrad Meyer 1899119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 1909119bafbSConrad Meyer inline pcg128_t pcg_output_rxs_m_xs_128_128(pcg128_t state) 1919119bafbSConrad Meyer { 1929119bafbSConrad Meyer pcg128_t word = ((state >> ((state >> 122u) + 6u)) ^ state) 1939119bafbSConrad Meyer * (PCG_128BIT_CONSTANT(17766728186571221404ULL, 1949119bafbSConrad Meyer 12605985483714917081ULL)); 1959119bafbSConrad Meyer /* 327738287884841127335028083622016905945 */ 1969119bafbSConrad Meyer return (word >> 86u) ^ word; 1979119bafbSConrad Meyer } 1989119bafbSConrad Meyer #endif 1999119bafbSConrad Meyer 2009119bafbSConrad Meyer /* RXS M */ 2019119bafbSConrad Meyer 2029119bafbSConrad Meyer inline uint8_t pcg_output_rxs_m_16_8(uint16_t state) 2039119bafbSConrad Meyer { 2049119bafbSConrad Meyer return (((state >> ((state >> 13u) + 3u)) ^ state) * 62169u) >> 8u; 2059119bafbSConrad Meyer } 2069119bafbSConrad Meyer 2079119bafbSConrad Meyer inline uint16_t pcg_output_rxs_m_32_16(uint32_t state) 2089119bafbSConrad Meyer { 2099119bafbSConrad Meyer return (((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u) >> 16u; 2109119bafbSConrad Meyer } 2119119bafbSConrad Meyer 2129119bafbSConrad Meyer inline uint32_t pcg_output_rxs_m_64_32(uint64_t state) 2139119bafbSConrad Meyer { 2149119bafbSConrad Meyer return (((state >> ((state >> 59u) + 5u)) ^ state) 2159119bafbSConrad Meyer * 12605985483714917081ull) >> 32u; 2169119bafbSConrad Meyer } 2179119bafbSConrad Meyer 2189119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 2199119bafbSConrad Meyer inline uint64_t pcg_output_rxs_m_128_64(pcg128_t state) 2209119bafbSConrad Meyer { 2219119bafbSConrad Meyer return (((state >> ((state >> 122u) + 6u)) ^ state) 2229119bafbSConrad Meyer * (PCG_128BIT_CONSTANT(17766728186571221404ULL, 2239119bafbSConrad Meyer 12605985483714917081ULL))) >> 64u; 2249119bafbSConrad Meyer /* 327738287884841127335028083622016905945 */ 2259119bafbSConrad Meyer } 2269119bafbSConrad Meyer #endif 2279119bafbSConrad Meyer 2289119bafbSConrad Meyer /* XSL RR (only defined for >= 64 bits) */ 2299119bafbSConrad Meyer 2309119bafbSConrad Meyer inline uint32_t pcg_output_xsl_rr_64_32(uint64_t state) 2319119bafbSConrad Meyer { 2329119bafbSConrad Meyer return pcg_rotr_32(((uint32_t)(state >> 32u)) ^ (uint32_t)state, 2339119bafbSConrad Meyer state >> 59u); 2349119bafbSConrad Meyer } 2359119bafbSConrad Meyer 2369119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 2379119bafbSConrad Meyer inline uint64_t pcg_output_xsl_rr_128_64(pcg128_t state) 2389119bafbSConrad Meyer { 2399119bafbSConrad Meyer return pcg_rotr_64(((uint64_t)(state >> 64u)) ^ (uint64_t)state, 2409119bafbSConrad Meyer state >> 122u); 2419119bafbSConrad Meyer } 2429119bafbSConrad Meyer #endif 2439119bafbSConrad Meyer 2449119bafbSConrad Meyer /* XSL RR RR (only defined for >= 64 bits) */ 2459119bafbSConrad Meyer 2469119bafbSConrad Meyer inline uint64_t pcg_output_xsl_rr_rr_64_64(uint64_t state) 2479119bafbSConrad Meyer { 2489119bafbSConrad Meyer uint32_t rot1 = (uint32_t)(state >> 59u); 2499119bafbSConrad Meyer uint32_t high = (uint32_t)(state >> 32u); 2509119bafbSConrad Meyer uint32_t low = (uint32_t)state; 2519119bafbSConrad Meyer uint32_t xored = high ^ low; 2529119bafbSConrad Meyer uint32_t newlow = pcg_rotr_32(xored, rot1); 2539119bafbSConrad Meyer uint32_t newhigh = pcg_rotr_32(high, newlow & 31u); 2549119bafbSConrad Meyer return (((uint64_t)newhigh) << 32u) | newlow; 2559119bafbSConrad Meyer } 2569119bafbSConrad Meyer 2579119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 2589119bafbSConrad Meyer inline pcg128_t pcg_output_xsl_rr_rr_128_128(pcg128_t state) 2599119bafbSConrad Meyer { 2609119bafbSConrad Meyer uint32_t rot1 = (uint32_t)(state >> 122u); 2619119bafbSConrad Meyer uint64_t high = (uint64_t)(state >> 64u); 2629119bafbSConrad Meyer uint64_t low = (uint64_t)state; 2639119bafbSConrad Meyer uint64_t xored = high ^ low; 2649119bafbSConrad Meyer uint64_t newlow = pcg_rotr_64(xored, rot1); 2659119bafbSConrad Meyer uint64_t newhigh = pcg_rotr_64(high, newlow & 63u); 2669119bafbSConrad Meyer return (((pcg128_t)newhigh) << 64u) | newlow; 2679119bafbSConrad Meyer } 2689119bafbSConrad Meyer #endif 2699119bafbSConrad Meyer 2709119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_8 141U 2719119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_16 12829U 2729119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_32 747796405U 2739119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_64 6364136223846793005ULL 2749119bafbSConrad Meyer 2759119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_8 77U 2769119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_16 47989U 2779119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_32 2891336453U 2789119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_64 1442695040888963407ULL 2799119bafbSConrad Meyer 2809119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 2819119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_128 \ 2829119bafbSConrad Meyer PCG_128BIT_CONSTANT(2549297995355413924ULL,4865540595714422341ULL) 2839119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_128 \ 2849119bafbSConrad Meyer PCG_128BIT_CONSTANT(6364136223846793005ULL,1442695040888963407ULL) 2859119bafbSConrad Meyer #endif 2869119bafbSConrad Meyer 2879119bafbSConrad Meyer /* 2889119bafbSConrad Meyer * Static initialization constants (if you can't call srandom for some 2899119bafbSConrad Meyer * bizarre reason). 2909119bafbSConrad Meyer */ 2919119bafbSConrad Meyer 2929119bafbSConrad Meyer #define PCG_STATE_ONESEQ_8_INITIALIZER { 0xd7U } 2939119bafbSConrad Meyer #define PCG_STATE_ONESEQ_16_INITIALIZER { 0x20dfU } 2949119bafbSConrad Meyer #define PCG_STATE_ONESEQ_32_INITIALIZER { 0x46b56677U } 2959119bafbSConrad Meyer #define PCG_STATE_ONESEQ_64_INITIALIZER { 0x4d595df4d0f33173ULL } 2969119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 2979119bafbSConrad Meyer #define PCG_STATE_ONESEQ_128_INITIALIZER \ 2989119bafbSConrad Meyer { PCG_128BIT_CONSTANT(0xb8dc10e158a92392ULL, 0x98046df007ec0a53ULL) } 2999119bafbSConrad Meyer #endif 3009119bafbSConrad Meyer 3019119bafbSConrad Meyer #define PCG_STATE_UNIQUE_8_INITIALIZER PCG_STATE_ONESEQ_8_INITIALIZER 3029119bafbSConrad Meyer #define PCG_STATE_UNIQUE_16_INITIALIZER PCG_STATE_ONESEQ_16_INITIALIZER 3039119bafbSConrad Meyer #define PCG_STATE_UNIQUE_32_INITIALIZER PCG_STATE_ONESEQ_32_INITIALIZER 3049119bafbSConrad Meyer #define PCG_STATE_UNIQUE_64_INITIALIZER PCG_STATE_ONESEQ_64_INITIALIZER 3059119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 3069119bafbSConrad Meyer #define PCG_STATE_UNIQUE_128_INITIALIZER PCG_STATE_ONESEQ_128_INITIALIZER 3079119bafbSConrad Meyer #endif 3089119bafbSConrad Meyer 3099119bafbSConrad Meyer #define PCG_STATE_MCG_8_INITIALIZER { 0xe5U } 3109119bafbSConrad Meyer #define PCG_STATE_MCG_16_INITIALIZER { 0xa5e5U } 3119119bafbSConrad Meyer #define PCG_STATE_MCG_32_INITIALIZER { 0xd15ea5e5U } 3129119bafbSConrad Meyer #define PCG_STATE_MCG_64_INITIALIZER { 0xcafef00dd15ea5e5ULL } 3139119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 3149119bafbSConrad Meyer #define PCG_STATE_MCG_128_INITIALIZER \ 3159119bafbSConrad Meyer { PCG_128BIT_CONSTANT(0x0000000000000000ULL, 0xcafef00dd15ea5e5ULL) } 3169119bafbSConrad Meyer #endif 3179119bafbSConrad Meyer 3189119bafbSConrad Meyer #define PCG_STATE_SETSEQ_8_INITIALIZER { 0x9bU, 0xdbU } 3199119bafbSConrad Meyer #define PCG_STATE_SETSEQ_16_INITIALIZER { 0xe39bU, 0x5bdbU } 3209119bafbSConrad Meyer #define PCG_STATE_SETSEQ_32_INITIALIZER { 0xec02d89bU, 0x94b95bdbU } 3219119bafbSConrad Meyer #define PCG_STATE_SETSEQ_64_INITIALIZER \ 3229119bafbSConrad Meyer { 0x853c49e6748fea9bULL, 0xda3e39cb94b95bdbULL } 3239119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 3249119bafbSConrad Meyer #define PCG_STATE_SETSEQ_128_INITIALIZER \ 3259119bafbSConrad Meyer { PCG_128BIT_CONSTANT(0x979c9a98d8462005ULL, 0x7d3e9cb6cfe0549bULL), \ 3269119bafbSConrad Meyer PCG_128BIT_CONSTANT(0x0000000000000001ULL, 0xda3e39cb94b95bdbULL) } 3279119bafbSConrad Meyer #endif 3289119bafbSConrad Meyer 3299119bafbSConrad Meyer /* Representations for the oneseq, mcg, and unique variants */ 3309119bafbSConrad Meyer 3319119bafbSConrad Meyer struct pcg_state_8 { 3329119bafbSConrad Meyer uint8_t state; 3339119bafbSConrad Meyer }; 3349119bafbSConrad Meyer 3359119bafbSConrad Meyer struct pcg_state_16 { 3369119bafbSConrad Meyer uint16_t state; 3379119bafbSConrad Meyer }; 3389119bafbSConrad Meyer 3399119bafbSConrad Meyer struct pcg_state_32 { 3409119bafbSConrad Meyer uint32_t state; 3419119bafbSConrad Meyer }; 3429119bafbSConrad Meyer 3439119bafbSConrad Meyer struct pcg_state_64 { 3449119bafbSConrad Meyer uint64_t state; 3459119bafbSConrad Meyer }; 3469119bafbSConrad Meyer 3479119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 3489119bafbSConrad Meyer struct pcg_state_128 { 3499119bafbSConrad Meyer pcg128_t state; 3509119bafbSConrad Meyer }; 3519119bafbSConrad Meyer #endif 3529119bafbSConrad Meyer 3539119bafbSConrad Meyer /* Representations setseq variants */ 3549119bafbSConrad Meyer 3559119bafbSConrad Meyer struct pcg_state_setseq_8 { 3569119bafbSConrad Meyer uint8_t state; 3579119bafbSConrad Meyer uint8_t inc; 3589119bafbSConrad Meyer }; 3599119bafbSConrad Meyer 3609119bafbSConrad Meyer struct pcg_state_setseq_16 { 3619119bafbSConrad Meyer uint16_t state; 3629119bafbSConrad Meyer uint16_t inc; 3639119bafbSConrad Meyer }; 3649119bafbSConrad Meyer 3659119bafbSConrad Meyer struct pcg_state_setseq_32 { 3669119bafbSConrad Meyer uint32_t state; 3679119bafbSConrad Meyer uint32_t inc; 3689119bafbSConrad Meyer }; 3699119bafbSConrad Meyer 3709119bafbSConrad Meyer struct pcg_state_setseq_64 { 3719119bafbSConrad Meyer uint64_t state; 3729119bafbSConrad Meyer uint64_t inc; 3739119bafbSConrad Meyer }; 3749119bafbSConrad Meyer 3759119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 3769119bafbSConrad Meyer struct pcg_state_setseq_128 { 3779119bafbSConrad Meyer pcg128_t state; 3789119bafbSConrad Meyer pcg128_t inc; 3799119bafbSConrad Meyer }; 3809119bafbSConrad Meyer #endif 3819119bafbSConrad Meyer 3829119bafbSConrad Meyer /* Multi-step advance functions (jump-ahead, jump-back) */ 3839119bafbSConrad Meyer 3849119bafbSConrad Meyer extern uint8_t pcg_advance_lcg_8(uint8_t state, uint8_t delta, uint8_t cur_mult, 3859119bafbSConrad Meyer uint8_t cur_plus); 3869119bafbSConrad Meyer extern uint16_t pcg_advance_lcg_16(uint16_t state, uint16_t delta, 3879119bafbSConrad Meyer uint16_t cur_mult, uint16_t cur_plus); 3889119bafbSConrad Meyer extern uint32_t pcg_advance_lcg_32(uint32_t state, uint32_t delta, 3899119bafbSConrad Meyer uint32_t cur_mult, uint32_t cur_plus); 3909119bafbSConrad Meyer extern uint64_t pcg_advance_lcg_64(uint64_t state, uint64_t delta, 3919119bafbSConrad Meyer uint64_t cur_mult, uint64_t cur_plus); 3929119bafbSConrad Meyer 3939119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 3949119bafbSConrad Meyer extern pcg128_t pcg_advance_lcg_128(pcg128_t state, pcg128_t delta, 3959119bafbSConrad Meyer pcg128_t cur_mult, pcg128_t cur_plus); 3969119bafbSConrad Meyer #endif 3979119bafbSConrad Meyer 3989119bafbSConrad Meyer /* Functions to advance the underlying LCG, one version for each size and 3999119bafbSConrad Meyer * each style. These functions are considered semi-private. There is rarely 4009119bafbSConrad Meyer * a good reason to call them directly. 4019119bafbSConrad Meyer */ 4029119bafbSConrad Meyer 4039119bafbSConrad Meyer inline void pcg_oneseq_8_step_r(struct pcg_state_8* rng) 4049119bafbSConrad Meyer { 4059119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8 4069119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_8; 4079119bafbSConrad Meyer } 4089119bafbSConrad Meyer 4099119bafbSConrad Meyer inline void pcg_oneseq_8_advance_r(struct pcg_state_8* rng, uint8_t delta) 4109119bafbSConrad Meyer { 4119119bafbSConrad Meyer rng->state = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8, 4129119bafbSConrad Meyer PCG_DEFAULT_INCREMENT_8); 4139119bafbSConrad Meyer } 4149119bafbSConrad Meyer 4159119bafbSConrad Meyer inline void pcg_mcg_8_step_r(struct pcg_state_8* rng) 4169119bafbSConrad Meyer { 4179119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8; 4189119bafbSConrad Meyer } 4199119bafbSConrad Meyer 4209119bafbSConrad Meyer inline void pcg_mcg_8_advance_r(struct pcg_state_8* rng, uint8_t delta) 4219119bafbSConrad Meyer { 4229119bafbSConrad Meyer rng->state 4239119bafbSConrad Meyer = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8, 0u); 4249119bafbSConrad Meyer } 4259119bafbSConrad Meyer 4269119bafbSConrad Meyer inline void pcg_unique_8_step_r(struct pcg_state_8* rng) 4279119bafbSConrad Meyer { 4289119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8 4299119bafbSConrad Meyer + (uint8_t)(((intptr_t)rng) | 1u); 4309119bafbSConrad Meyer } 4319119bafbSConrad Meyer 4329119bafbSConrad Meyer inline void pcg_unique_8_advance_r(struct pcg_state_8* rng, uint8_t delta) 4339119bafbSConrad Meyer { 4349119bafbSConrad Meyer rng->state = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8, 4359119bafbSConrad Meyer (uint8_t)(((intptr_t)rng) | 1u)); 4369119bafbSConrad Meyer } 4379119bafbSConrad Meyer 4389119bafbSConrad Meyer inline void pcg_setseq_8_step_r(struct pcg_state_setseq_8* rng) 4399119bafbSConrad Meyer { 4409119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8 + rng->inc; 4419119bafbSConrad Meyer } 4429119bafbSConrad Meyer 4439119bafbSConrad Meyer inline void pcg_setseq_8_advance_r(struct pcg_state_setseq_8* rng, 4449119bafbSConrad Meyer uint8_t delta) 4459119bafbSConrad Meyer { 4469119bafbSConrad Meyer rng->state = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8, 4479119bafbSConrad Meyer rng->inc); 4489119bafbSConrad Meyer } 4499119bafbSConrad Meyer 4509119bafbSConrad Meyer inline void pcg_oneseq_16_step_r(struct pcg_state_16* rng) 4519119bafbSConrad Meyer { 4529119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16 4539119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_16; 4549119bafbSConrad Meyer } 4559119bafbSConrad Meyer 4569119bafbSConrad Meyer inline void pcg_oneseq_16_advance_r(struct pcg_state_16* rng, uint16_t delta) 4579119bafbSConrad Meyer { 4589119bafbSConrad Meyer rng->state = pcg_advance_lcg_16( 4599119bafbSConrad Meyer rng->state, delta, PCG_DEFAULT_MULTIPLIER_16, PCG_DEFAULT_INCREMENT_16); 4609119bafbSConrad Meyer } 4619119bafbSConrad Meyer 4629119bafbSConrad Meyer inline void pcg_mcg_16_step_r(struct pcg_state_16* rng) 4639119bafbSConrad Meyer { 4649119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16; 4659119bafbSConrad Meyer } 4669119bafbSConrad Meyer 4679119bafbSConrad Meyer inline void pcg_mcg_16_advance_r(struct pcg_state_16* rng, uint16_t delta) 4689119bafbSConrad Meyer { 4699119bafbSConrad Meyer rng->state 4709119bafbSConrad Meyer = pcg_advance_lcg_16(rng->state, delta, PCG_DEFAULT_MULTIPLIER_16, 0u); 4719119bafbSConrad Meyer } 4729119bafbSConrad Meyer 4739119bafbSConrad Meyer inline void pcg_unique_16_step_r(struct pcg_state_16* rng) 4749119bafbSConrad Meyer { 4759119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16 4769119bafbSConrad Meyer + (uint16_t)(((intptr_t)rng) | 1u); 4779119bafbSConrad Meyer } 4789119bafbSConrad Meyer 4799119bafbSConrad Meyer inline void pcg_unique_16_advance_r(struct pcg_state_16* rng, uint16_t delta) 4809119bafbSConrad Meyer { 4819119bafbSConrad Meyer rng->state 4829119bafbSConrad Meyer = pcg_advance_lcg_16(rng->state, delta, PCG_DEFAULT_MULTIPLIER_16, 4839119bafbSConrad Meyer (uint16_t)(((intptr_t)rng) | 1u)); 4849119bafbSConrad Meyer } 4859119bafbSConrad Meyer 4869119bafbSConrad Meyer inline void pcg_setseq_16_step_r(struct pcg_state_setseq_16* rng) 4879119bafbSConrad Meyer { 4889119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16 + rng->inc; 4899119bafbSConrad Meyer } 4909119bafbSConrad Meyer 4919119bafbSConrad Meyer inline void pcg_setseq_16_advance_r(struct pcg_state_setseq_16* rng, 4929119bafbSConrad Meyer uint16_t delta) 4939119bafbSConrad Meyer { 4949119bafbSConrad Meyer rng->state = pcg_advance_lcg_16(rng->state, delta, 4959119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_16, rng->inc); 4969119bafbSConrad Meyer } 4979119bafbSConrad Meyer 4989119bafbSConrad Meyer inline void pcg_oneseq_32_step_r(struct pcg_state_32* rng) 4999119bafbSConrad Meyer { 5009119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32 5019119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_32; 5029119bafbSConrad Meyer } 5039119bafbSConrad Meyer 5049119bafbSConrad Meyer inline void pcg_oneseq_32_advance_r(struct pcg_state_32* rng, uint32_t delta) 5059119bafbSConrad Meyer { 5069119bafbSConrad Meyer rng->state = pcg_advance_lcg_32( 5079119bafbSConrad Meyer rng->state, delta, PCG_DEFAULT_MULTIPLIER_32, PCG_DEFAULT_INCREMENT_32); 5089119bafbSConrad Meyer } 5099119bafbSConrad Meyer 5109119bafbSConrad Meyer inline void pcg_mcg_32_step_r(struct pcg_state_32* rng) 5119119bafbSConrad Meyer { 5129119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32; 5139119bafbSConrad Meyer } 5149119bafbSConrad Meyer 5159119bafbSConrad Meyer inline void pcg_mcg_32_advance_r(struct pcg_state_32* rng, uint32_t delta) 5169119bafbSConrad Meyer { 5179119bafbSConrad Meyer rng->state 5189119bafbSConrad Meyer = pcg_advance_lcg_32(rng->state, delta, PCG_DEFAULT_MULTIPLIER_32, 0u); 5199119bafbSConrad Meyer } 5209119bafbSConrad Meyer 5219119bafbSConrad Meyer inline void pcg_unique_32_step_r(struct pcg_state_32* rng) 5229119bafbSConrad Meyer { 5239119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32 5249119bafbSConrad Meyer + (uint32_t)(((intptr_t)rng) | 1u); 5259119bafbSConrad Meyer } 5269119bafbSConrad Meyer 5279119bafbSConrad Meyer inline void pcg_unique_32_advance_r(struct pcg_state_32* rng, uint32_t delta) 5289119bafbSConrad Meyer { 5299119bafbSConrad Meyer rng->state 5309119bafbSConrad Meyer = pcg_advance_lcg_32(rng->state, delta, PCG_DEFAULT_MULTIPLIER_32, 5319119bafbSConrad Meyer (uint32_t)(((intptr_t)rng) | 1u)); 5329119bafbSConrad Meyer } 5339119bafbSConrad Meyer 5349119bafbSConrad Meyer inline void pcg_setseq_32_step_r(struct pcg_state_setseq_32* rng) 5359119bafbSConrad Meyer { 5369119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32 + rng->inc; 5379119bafbSConrad Meyer } 5389119bafbSConrad Meyer 5399119bafbSConrad Meyer inline void pcg_setseq_32_advance_r(struct pcg_state_setseq_32* rng, 5409119bafbSConrad Meyer uint32_t delta) 5419119bafbSConrad Meyer { 5429119bafbSConrad Meyer rng->state = pcg_advance_lcg_32(rng->state, delta, 5439119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_32, rng->inc); 5449119bafbSConrad Meyer } 5459119bafbSConrad Meyer 5469119bafbSConrad Meyer inline void pcg_oneseq_64_step_r(struct pcg_state_64* rng) 5479119bafbSConrad Meyer { 5489119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64 5499119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_64; 5509119bafbSConrad Meyer } 5519119bafbSConrad Meyer 5529119bafbSConrad Meyer inline void pcg_oneseq_64_advance_r(struct pcg_state_64* rng, uint64_t delta) 5539119bafbSConrad Meyer { 5549119bafbSConrad Meyer rng->state = pcg_advance_lcg_64( 5559119bafbSConrad Meyer rng->state, delta, PCG_DEFAULT_MULTIPLIER_64, PCG_DEFAULT_INCREMENT_64); 5569119bafbSConrad Meyer } 5579119bafbSConrad Meyer 5589119bafbSConrad Meyer inline void pcg_mcg_64_step_r(struct pcg_state_64* rng) 5599119bafbSConrad Meyer { 5609119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64; 5619119bafbSConrad Meyer } 5629119bafbSConrad Meyer 5639119bafbSConrad Meyer inline void pcg_mcg_64_advance_r(struct pcg_state_64* rng, uint64_t delta) 5649119bafbSConrad Meyer { 5659119bafbSConrad Meyer rng->state 5669119bafbSConrad Meyer = pcg_advance_lcg_64(rng->state, delta, PCG_DEFAULT_MULTIPLIER_64, 0u); 5679119bafbSConrad Meyer } 5689119bafbSConrad Meyer 5699119bafbSConrad Meyer inline void pcg_unique_64_step_r(struct pcg_state_64* rng) 5709119bafbSConrad Meyer { 5719119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64 5729119bafbSConrad Meyer + (uint64_t)(((intptr_t)rng) | 1u); 5739119bafbSConrad Meyer } 5749119bafbSConrad Meyer 5759119bafbSConrad Meyer inline void pcg_unique_64_advance_r(struct pcg_state_64* rng, uint64_t delta) 5769119bafbSConrad Meyer { 5779119bafbSConrad Meyer rng->state 5789119bafbSConrad Meyer = pcg_advance_lcg_64(rng->state, delta, PCG_DEFAULT_MULTIPLIER_64, 5799119bafbSConrad Meyer (uint64_t)(((intptr_t)rng) | 1u)); 5809119bafbSConrad Meyer } 5819119bafbSConrad Meyer 5829119bafbSConrad Meyer inline void pcg_setseq_64_step_r(struct pcg_state_setseq_64* rng) 5839119bafbSConrad Meyer { 5849119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64 + rng->inc; 5859119bafbSConrad Meyer } 5869119bafbSConrad Meyer 5879119bafbSConrad Meyer inline void pcg_setseq_64_advance_r(struct pcg_state_setseq_64* rng, 5889119bafbSConrad Meyer uint64_t delta) 5899119bafbSConrad Meyer { 5909119bafbSConrad Meyer rng->state = pcg_advance_lcg_64(rng->state, delta, 5919119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_64, rng->inc); 5929119bafbSConrad Meyer } 5939119bafbSConrad Meyer 5949119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 5959119bafbSConrad Meyer inline void pcg_oneseq_128_step_r(struct pcg_state_128* rng) 5969119bafbSConrad Meyer { 5979119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128 5989119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_128; 5999119bafbSConrad Meyer } 6009119bafbSConrad Meyer #endif 6019119bafbSConrad Meyer 6029119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 6039119bafbSConrad Meyer inline void pcg_oneseq_128_advance_r(struct pcg_state_128* rng, pcg128_t delta) 6049119bafbSConrad Meyer { 6059119bafbSConrad Meyer rng->state 6069119bafbSConrad Meyer = pcg_advance_lcg_128(rng->state, delta, PCG_DEFAULT_MULTIPLIER_128, 6079119bafbSConrad Meyer PCG_DEFAULT_INCREMENT_128); 6089119bafbSConrad Meyer } 6099119bafbSConrad Meyer #endif 6109119bafbSConrad Meyer 6119119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 6129119bafbSConrad Meyer inline void pcg_mcg_128_step_r(struct pcg_state_128* rng) 6139119bafbSConrad Meyer { 6149119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128; 6159119bafbSConrad Meyer } 6169119bafbSConrad Meyer #endif 6179119bafbSConrad Meyer 6189119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 6199119bafbSConrad Meyer inline void pcg_mcg_128_advance_r(struct pcg_state_128* rng, pcg128_t delta) 6209119bafbSConrad Meyer { 6219119bafbSConrad Meyer rng->state = pcg_advance_lcg_128(rng->state, delta, 6229119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_128, 0u); 6239119bafbSConrad Meyer } 6249119bafbSConrad Meyer #endif 6259119bafbSConrad Meyer 6269119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 6279119bafbSConrad Meyer inline void pcg_unique_128_step_r(struct pcg_state_128* rng) 6289119bafbSConrad Meyer { 6299119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128 6309119bafbSConrad Meyer + (pcg128_t)(((intptr_t)rng) | 1u); 6319119bafbSConrad Meyer } 6329119bafbSConrad Meyer #endif 6339119bafbSConrad Meyer 6349119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 6359119bafbSConrad Meyer inline void pcg_unique_128_advance_r(struct pcg_state_128* rng, pcg128_t delta) 6369119bafbSConrad Meyer { 6379119bafbSConrad Meyer rng->state 6389119bafbSConrad Meyer = pcg_advance_lcg_128(rng->state, delta, PCG_DEFAULT_MULTIPLIER_128, 6399119bafbSConrad Meyer (pcg128_t)(((intptr_t)rng) | 1u)); 6409119bafbSConrad Meyer } 6419119bafbSConrad Meyer #endif 6429119bafbSConrad Meyer 6439119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 6449119bafbSConrad Meyer inline void pcg_setseq_128_step_r(struct pcg_state_setseq_128* rng) 6459119bafbSConrad Meyer { 6469119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128 + rng->inc; 6479119bafbSConrad Meyer } 6489119bafbSConrad Meyer #endif 6499119bafbSConrad Meyer 6509119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 6519119bafbSConrad Meyer inline void pcg_setseq_128_advance_r(struct pcg_state_setseq_128* rng, 6529119bafbSConrad Meyer pcg128_t delta) 6539119bafbSConrad Meyer { 6549119bafbSConrad Meyer rng->state = pcg_advance_lcg_128(rng->state, delta, 6559119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_128, rng->inc); 6569119bafbSConrad Meyer } 6579119bafbSConrad Meyer #endif 6589119bafbSConrad Meyer 6599119bafbSConrad Meyer /* Functions to seed the RNG state, one version for each size and each 6609119bafbSConrad Meyer * style. Unlike the step functions, regular users can and should call 6619119bafbSConrad Meyer * these functions. 6629119bafbSConrad Meyer */ 6639119bafbSConrad Meyer 6649119bafbSConrad Meyer inline void pcg_oneseq_8_srandom_r(struct pcg_state_8* rng, uint8_t initstate) 6659119bafbSConrad Meyer { 6669119bafbSConrad Meyer rng->state = 0U; 6679119bafbSConrad Meyer pcg_oneseq_8_step_r(rng); 6689119bafbSConrad Meyer rng->state += initstate; 6699119bafbSConrad Meyer pcg_oneseq_8_step_r(rng); 6709119bafbSConrad Meyer } 6719119bafbSConrad Meyer 6729119bafbSConrad Meyer inline void pcg_mcg_8_srandom_r(struct pcg_state_8* rng, uint8_t initstate) 6739119bafbSConrad Meyer { 6749119bafbSConrad Meyer rng->state = initstate | 1u; 6759119bafbSConrad Meyer } 6769119bafbSConrad Meyer 6779119bafbSConrad Meyer inline void pcg_unique_8_srandom_r(struct pcg_state_8* rng, uint8_t initstate) 6789119bafbSConrad Meyer { 6799119bafbSConrad Meyer rng->state = 0U; 6809119bafbSConrad Meyer pcg_unique_8_step_r(rng); 6819119bafbSConrad Meyer rng->state += initstate; 6829119bafbSConrad Meyer pcg_unique_8_step_r(rng); 6839119bafbSConrad Meyer } 6849119bafbSConrad Meyer 6859119bafbSConrad Meyer inline void pcg_setseq_8_srandom_r(struct pcg_state_setseq_8* rng, 6869119bafbSConrad Meyer uint8_t initstate, uint8_t initseq) 6879119bafbSConrad Meyer { 6889119bafbSConrad Meyer rng->state = 0U; 6899119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u; 6909119bafbSConrad Meyer pcg_setseq_8_step_r(rng); 6919119bafbSConrad Meyer rng->state += initstate; 6929119bafbSConrad Meyer pcg_setseq_8_step_r(rng); 6939119bafbSConrad Meyer } 6949119bafbSConrad Meyer 6959119bafbSConrad Meyer inline void pcg_oneseq_16_srandom_r(struct pcg_state_16* rng, 6969119bafbSConrad Meyer uint16_t initstate) 6979119bafbSConrad Meyer { 6989119bafbSConrad Meyer rng->state = 0U; 6999119bafbSConrad Meyer pcg_oneseq_16_step_r(rng); 7009119bafbSConrad Meyer rng->state += initstate; 7019119bafbSConrad Meyer pcg_oneseq_16_step_r(rng); 7029119bafbSConrad Meyer } 7039119bafbSConrad Meyer 7049119bafbSConrad Meyer inline void pcg_mcg_16_srandom_r(struct pcg_state_16* rng, uint16_t initstate) 7059119bafbSConrad Meyer { 7069119bafbSConrad Meyer rng->state = initstate | 1u; 7079119bafbSConrad Meyer } 7089119bafbSConrad Meyer 7099119bafbSConrad Meyer inline void pcg_unique_16_srandom_r(struct pcg_state_16* rng, 7109119bafbSConrad Meyer uint16_t initstate) 7119119bafbSConrad Meyer { 7129119bafbSConrad Meyer rng->state = 0U; 7139119bafbSConrad Meyer pcg_unique_16_step_r(rng); 7149119bafbSConrad Meyer rng->state += initstate; 7159119bafbSConrad Meyer pcg_unique_16_step_r(rng); 7169119bafbSConrad Meyer } 7179119bafbSConrad Meyer 7189119bafbSConrad Meyer inline void pcg_setseq_16_srandom_r(struct pcg_state_setseq_16* rng, 7199119bafbSConrad Meyer uint16_t initstate, uint16_t initseq) 7209119bafbSConrad Meyer { 7219119bafbSConrad Meyer rng->state = 0U; 7229119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u; 7239119bafbSConrad Meyer pcg_setseq_16_step_r(rng); 7249119bafbSConrad Meyer rng->state += initstate; 7259119bafbSConrad Meyer pcg_setseq_16_step_r(rng); 7269119bafbSConrad Meyer } 7279119bafbSConrad Meyer 7289119bafbSConrad Meyer inline void pcg_oneseq_32_srandom_r(struct pcg_state_32* rng, 7299119bafbSConrad Meyer uint32_t initstate) 7309119bafbSConrad Meyer { 7319119bafbSConrad Meyer rng->state = 0U; 7329119bafbSConrad Meyer pcg_oneseq_32_step_r(rng); 7339119bafbSConrad Meyer rng->state += initstate; 7349119bafbSConrad Meyer pcg_oneseq_32_step_r(rng); 7359119bafbSConrad Meyer } 7369119bafbSConrad Meyer 7379119bafbSConrad Meyer inline void pcg_mcg_32_srandom_r(struct pcg_state_32* rng, uint32_t initstate) 7389119bafbSConrad Meyer { 7399119bafbSConrad Meyer rng->state = initstate | 1u; 7409119bafbSConrad Meyer } 7419119bafbSConrad Meyer 7429119bafbSConrad Meyer inline void pcg_unique_32_srandom_r(struct pcg_state_32* rng, 7439119bafbSConrad Meyer uint32_t initstate) 7449119bafbSConrad Meyer { 7459119bafbSConrad Meyer rng->state = 0U; 7469119bafbSConrad Meyer pcg_unique_32_step_r(rng); 7479119bafbSConrad Meyer rng->state += initstate; 7489119bafbSConrad Meyer pcg_unique_32_step_r(rng); 7499119bafbSConrad Meyer } 7509119bafbSConrad Meyer 7519119bafbSConrad Meyer inline void pcg_setseq_32_srandom_r(struct pcg_state_setseq_32* rng, 7529119bafbSConrad Meyer uint32_t initstate, uint32_t initseq) 7539119bafbSConrad Meyer { 7549119bafbSConrad Meyer rng->state = 0U; 7559119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u; 7569119bafbSConrad Meyer pcg_setseq_32_step_r(rng); 7579119bafbSConrad Meyer rng->state += initstate; 7589119bafbSConrad Meyer pcg_setseq_32_step_r(rng); 7599119bafbSConrad Meyer } 7609119bafbSConrad Meyer 7619119bafbSConrad Meyer inline void pcg_oneseq_64_srandom_r(struct pcg_state_64* rng, 7629119bafbSConrad Meyer uint64_t initstate) 7639119bafbSConrad Meyer { 7649119bafbSConrad Meyer rng->state = 0U; 7659119bafbSConrad Meyer pcg_oneseq_64_step_r(rng); 7669119bafbSConrad Meyer rng->state += initstate; 7679119bafbSConrad Meyer pcg_oneseq_64_step_r(rng); 7689119bafbSConrad Meyer } 7699119bafbSConrad Meyer 7709119bafbSConrad Meyer inline void pcg_mcg_64_srandom_r(struct pcg_state_64* rng, uint64_t initstate) 7719119bafbSConrad Meyer { 7729119bafbSConrad Meyer rng->state = initstate | 1u; 7739119bafbSConrad Meyer } 7749119bafbSConrad Meyer 7759119bafbSConrad Meyer inline void pcg_unique_64_srandom_r(struct pcg_state_64* rng, 7769119bafbSConrad Meyer uint64_t initstate) 7779119bafbSConrad Meyer { 7789119bafbSConrad Meyer rng->state = 0U; 7799119bafbSConrad Meyer pcg_unique_64_step_r(rng); 7809119bafbSConrad Meyer rng->state += initstate; 7819119bafbSConrad Meyer pcg_unique_64_step_r(rng); 7829119bafbSConrad Meyer } 7839119bafbSConrad Meyer 7849119bafbSConrad Meyer inline void pcg_setseq_64_srandom_r(struct pcg_state_setseq_64* rng, 7859119bafbSConrad Meyer uint64_t initstate, uint64_t initseq) 7869119bafbSConrad Meyer { 7879119bafbSConrad Meyer rng->state = 0U; 7889119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u; 7899119bafbSConrad Meyer pcg_setseq_64_step_r(rng); 7909119bafbSConrad Meyer rng->state += initstate; 7919119bafbSConrad Meyer pcg_setseq_64_step_r(rng); 7929119bafbSConrad Meyer } 7939119bafbSConrad Meyer 7949119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 7959119bafbSConrad Meyer inline void pcg_oneseq_128_srandom_r(struct pcg_state_128* rng, 7969119bafbSConrad Meyer pcg128_t initstate) 7979119bafbSConrad Meyer { 7989119bafbSConrad Meyer rng->state = 0U; 7999119bafbSConrad Meyer pcg_oneseq_128_step_r(rng); 8009119bafbSConrad Meyer rng->state += initstate; 8019119bafbSConrad Meyer pcg_oneseq_128_step_r(rng); 8029119bafbSConrad Meyer } 8039119bafbSConrad Meyer #endif 8049119bafbSConrad Meyer 8059119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 8069119bafbSConrad Meyer inline void pcg_mcg_128_srandom_r(struct pcg_state_128* rng, pcg128_t initstate) 8079119bafbSConrad Meyer { 8089119bafbSConrad Meyer rng->state = initstate | 1u; 8099119bafbSConrad Meyer } 8109119bafbSConrad Meyer #endif 8119119bafbSConrad Meyer 8129119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 8139119bafbSConrad Meyer inline void pcg_unique_128_srandom_r(struct pcg_state_128* rng, 8149119bafbSConrad Meyer pcg128_t initstate) 8159119bafbSConrad Meyer { 8169119bafbSConrad Meyer rng->state = 0U; 8179119bafbSConrad Meyer pcg_unique_128_step_r(rng); 8189119bafbSConrad Meyer rng->state += initstate; 8199119bafbSConrad Meyer pcg_unique_128_step_r(rng); 8209119bafbSConrad Meyer } 8219119bafbSConrad Meyer #endif 8229119bafbSConrad Meyer 8239119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 8249119bafbSConrad Meyer inline void pcg_setseq_128_srandom_r(struct pcg_state_setseq_128* rng, 8259119bafbSConrad Meyer pcg128_t initstate, pcg128_t initseq) 8269119bafbSConrad Meyer { 8279119bafbSConrad Meyer rng->state = 0U; 8289119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u; 8299119bafbSConrad Meyer pcg_setseq_128_step_r(rng); 8309119bafbSConrad Meyer rng->state += initstate; 8319119bafbSConrad Meyer pcg_setseq_128_step_r(rng); 8329119bafbSConrad Meyer } 8339119bafbSConrad Meyer #endif 8349119bafbSConrad Meyer 8359119bafbSConrad Meyer /* Now, finally we create each of the individual generators. We provide 8369119bafbSConrad Meyer * a random_r function that provides a random number of the appropriate 8379119bafbSConrad Meyer * type (using the full range of the type) and a boundedrand_r version 8389119bafbSConrad Meyer * that provides 8399119bafbSConrad Meyer * 8409119bafbSConrad Meyer * Implementation notes for boundedrand_r: 8419119bafbSConrad Meyer * 8429119bafbSConrad Meyer * To avoid bias, we need to make the range of the RNG a multiple of 8439119bafbSConrad Meyer * bound, which we do by dropping output less than a threshold. 8449119bafbSConrad Meyer * Let's consider a 32-bit case... A naive scheme to calculate the 8459119bafbSConrad Meyer * threshold would be to do 8469119bafbSConrad Meyer * 8479119bafbSConrad Meyer * uint32_t threshold = 0x100000000ull % bound; 8489119bafbSConrad Meyer * 8499119bafbSConrad Meyer * but 64-bit div/mod is slower than 32-bit div/mod (especially on 8509119bafbSConrad Meyer * 32-bit platforms). In essence, we do 8519119bafbSConrad Meyer * 8529119bafbSConrad Meyer * uint32_t threshold = (0x100000000ull-bound) % bound; 8539119bafbSConrad Meyer * 8549119bafbSConrad Meyer * because this version will calculate the same modulus, but the LHS 8559119bafbSConrad Meyer * value is less than 2^32. 8569119bafbSConrad Meyer * 8579119bafbSConrad Meyer * (Note that using modulo is only wise for good RNGs, poorer RNGs 8589119bafbSConrad Meyer * such as raw LCGs do better using a technique based on division.) 8599119bafbSConrad Meyer * Empricical tests show that division is preferable to modulus for 8609119bafbSConrad Meyer * reducting the range of an RNG. It's faster, and sometimes it can 8619119bafbSConrad Meyer * even be statistically prefereable. 8629119bafbSConrad Meyer */ 8639119bafbSConrad Meyer 8649119bafbSConrad Meyer /* Generation functions for XSH RS */ 8659119bafbSConrad Meyer 8669119bafbSConrad Meyer inline uint8_t pcg_oneseq_16_xsh_rs_8_random_r(struct pcg_state_16* rng) 8679119bafbSConrad Meyer { 8689119bafbSConrad Meyer uint16_t oldstate = rng->state; 8699119bafbSConrad Meyer pcg_oneseq_16_step_r(rng); 8709119bafbSConrad Meyer return pcg_output_xsh_rs_16_8(oldstate); 8719119bafbSConrad Meyer } 8729119bafbSConrad Meyer 8739119bafbSConrad Meyer inline uint8_t pcg_oneseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_16* rng, 8749119bafbSConrad Meyer uint8_t bound) 8759119bafbSConrad Meyer { 8769119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 8779119bafbSConrad Meyer for (;;) { 8789119bafbSConrad Meyer uint8_t r = pcg_oneseq_16_xsh_rs_8_random_r(rng); 8799119bafbSConrad Meyer if (r >= threshold) 8809119bafbSConrad Meyer return r % bound; 8819119bafbSConrad Meyer } 8829119bafbSConrad Meyer } 8839119bafbSConrad Meyer 8849119bafbSConrad Meyer inline uint16_t pcg_oneseq_32_xsh_rs_16_random_r(struct pcg_state_32* rng) 8859119bafbSConrad Meyer { 8869119bafbSConrad Meyer uint32_t oldstate = rng->state; 8879119bafbSConrad Meyer pcg_oneseq_32_step_r(rng); 8889119bafbSConrad Meyer return pcg_output_xsh_rs_32_16(oldstate); 8899119bafbSConrad Meyer } 8909119bafbSConrad Meyer 8919119bafbSConrad Meyer inline uint16_t pcg_oneseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_32* rng, 8929119bafbSConrad Meyer uint16_t bound) 8939119bafbSConrad Meyer { 8949119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 8959119bafbSConrad Meyer for (;;) { 8969119bafbSConrad Meyer uint16_t r = pcg_oneseq_32_xsh_rs_16_random_r(rng); 8979119bafbSConrad Meyer if (r >= threshold) 8989119bafbSConrad Meyer return r % bound; 8999119bafbSConrad Meyer } 9009119bafbSConrad Meyer } 9019119bafbSConrad Meyer 9029119bafbSConrad Meyer inline uint32_t pcg_oneseq_64_xsh_rs_32_random_r(struct pcg_state_64* rng) 9039119bafbSConrad Meyer { 9049119bafbSConrad Meyer uint64_t oldstate = rng->state; 9059119bafbSConrad Meyer pcg_oneseq_64_step_r(rng); 9069119bafbSConrad Meyer return pcg_output_xsh_rs_64_32(oldstate); 9079119bafbSConrad Meyer } 9089119bafbSConrad Meyer 9099119bafbSConrad Meyer inline uint32_t pcg_oneseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_64* rng, 9109119bafbSConrad Meyer uint32_t bound) 9119119bafbSConrad Meyer { 9129119bafbSConrad Meyer uint32_t threshold = -bound % bound; 9139119bafbSConrad Meyer for (;;) { 9149119bafbSConrad Meyer uint32_t r = pcg_oneseq_64_xsh_rs_32_random_r(rng); 9159119bafbSConrad Meyer if (r >= threshold) 9169119bafbSConrad Meyer return r % bound; 9179119bafbSConrad Meyer } 9189119bafbSConrad Meyer } 9199119bafbSConrad Meyer 9209119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 9219119bafbSConrad Meyer inline uint64_t pcg_oneseq_128_xsh_rs_64_random_r(struct pcg_state_128* rng) 9229119bafbSConrad Meyer { 9239119bafbSConrad Meyer pcg_oneseq_128_step_r(rng); 9249119bafbSConrad Meyer return pcg_output_xsh_rs_128_64(rng->state); 9259119bafbSConrad Meyer } 9269119bafbSConrad Meyer #endif 9279119bafbSConrad Meyer 9289119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 9299119bafbSConrad Meyer inline uint64_t 9309119bafbSConrad Meyer pcg_oneseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_128* rng, 9319119bafbSConrad Meyer uint64_t bound) 9329119bafbSConrad Meyer { 9339119bafbSConrad Meyer uint64_t threshold = -bound % bound; 9349119bafbSConrad Meyer for (;;) { 9359119bafbSConrad Meyer uint64_t r = pcg_oneseq_128_xsh_rs_64_random_r(rng); 9369119bafbSConrad Meyer if (r >= threshold) 9379119bafbSConrad Meyer return r % bound; 9389119bafbSConrad Meyer } 9399119bafbSConrad Meyer } 9409119bafbSConrad Meyer #endif 9419119bafbSConrad Meyer 9429119bafbSConrad Meyer inline uint8_t pcg_unique_16_xsh_rs_8_random_r(struct pcg_state_16* rng) 9439119bafbSConrad Meyer { 9449119bafbSConrad Meyer uint16_t oldstate = rng->state; 9459119bafbSConrad Meyer pcg_unique_16_step_r(rng); 9469119bafbSConrad Meyer return pcg_output_xsh_rs_16_8(oldstate); 9479119bafbSConrad Meyer } 9489119bafbSConrad Meyer 9499119bafbSConrad Meyer inline uint8_t pcg_unique_16_xsh_rs_8_boundedrand_r(struct pcg_state_16* rng, 9509119bafbSConrad Meyer uint8_t bound) 9519119bafbSConrad Meyer { 9529119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 9539119bafbSConrad Meyer for (;;) { 9549119bafbSConrad Meyer uint8_t r = pcg_unique_16_xsh_rs_8_random_r(rng); 9559119bafbSConrad Meyer if (r >= threshold) 9569119bafbSConrad Meyer return r % bound; 9579119bafbSConrad Meyer } 9589119bafbSConrad Meyer } 9599119bafbSConrad Meyer 9609119bafbSConrad Meyer inline uint16_t pcg_unique_32_xsh_rs_16_random_r(struct pcg_state_32* rng) 9619119bafbSConrad Meyer { 9629119bafbSConrad Meyer uint32_t oldstate = rng->state; 9639119bafbSConrad Meyer pcg_unique_32_step_r(rng); 9649119bafbSConrad Meyer return pcg_output_xsh_rs_32_16(oldstate); 9659119bafbSConrad Meyer } 9669119bafbSConrad Meyer 9679119bafbSConrad Meyer inline uint16_t pcg_unique_32_xsh_rs_16_boundedrand_r(struct pcg_state_32* rng, 9689119bafbSConrad Meyer uint16_t bound) 9699119bafbSConrad Meyer { 9709119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 9719119bafbSConrad Meyer for (;;) { 9729119bafbSConrad Meyer uint16_t r = pcg_unique_32_xsh_rs_16_random_r(rng); 9739119bafbSConrad Meyer if (r >= threshold) 9749119bafbSConrad Meyer return r % bound; 9759119bafbSConrad Meyer } 9769119bafbSConrad Meyer } 9779119bafbSConrad Meyer 9789119bafbSConrad Meyer inline uint32_t pcg_unique_64_xsh_rs_32_random_r(struct pcg_state_64* rng) 9799119bafbSConrad Meyer { 9809119bafbSConrad Meyer uint64_t oldstate = rng->state; 9819119bafbSConrad Meyer pcg_unique_64_step_r(rng); 9829119bafbSConrad Meyer return pcg_output_xsh_rs_64_32(oldstate); 9839119bafbSConrad Meyer } 9849119bafbSConrad Meyer 9859119bafbSConrad Meyer inline uint32_t pcg_unique_64_xsh_rs_32_boundedrand_r(struct pcg_state_64* rng, 9869119bafbSConrad Meyer uint32_t bound) 9879119bafbSConrad Meyer { 9889119bafbSConrad Meyer uint32_t threshold = -bound % bound; 9899119bafbSConrad Meyer for (;;) { 9909119bafbSConrad Meyer uint32_t r = pcg_unique_64_xsh_rs_32_random_r(rng); 9919119bafbSConrad Meyer if (r >= threshold) 9929119bafbSConrad Meyer return r % bound; 9939119bafbSConrad Meyer } 9949119bafbSConrad Meyer } 9959119bafbSConrad Meyer 9969119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 9979119bafbSConrad Meyer inline uint64_t pcg_unique_128_xsh_rs_64_random_r(struct pcg_state_128* rng) 9989119bafbSConrad Meyer { 9999119bafbSConrad Meyer pcg_unique_128_step_r(rng); 10009119bafbSConrad Meyer return pcg_output_xsh_rs_128_64(rng->state); 10019119bafbSConrad Meyer } 10029119bafbSConrad Meyer #endif 10039119bafbSConrad Meyer 10049119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 10059119bafbSConrad Meyer inline uint64_t 10069119bafbSConrad Meyer pcg_unique_128_xsh_rs_64_boundedrand_r(struct pcg_state_128* rng, 10079119bafbSConrad Meyer uint64_t bound) 10089119bafbSConrad Meyer { 10099119bafbSConrad Meyer uint64_t threshold = -bound % bound; 10109119bafbSConrad Meyer for (;;) { 10119119bafbSConrad Meyer uint64_t r = pcg_unique_128_xsh_rs_64_random_r(rng); 10129119bafbSConrad Meyer if (r >= threshold) 10139119bafbSConrad Meyer return r % bound; 10149119bafbSConrad Meyer } 10159119bafbSConrad Meyer } 10169119bafbSConrad Meyer #endif 10179119bafbSConrad Meyer 10189119bafbSConrad Meyer inline uint8_t pcg_setseq_16_xsh_rs_8_random_r(struct pcg_state_setseq_16* rng) 10199119bafbSConrad Meyer { 10209119bafbSConrad Meyer uint16_t oldstate = rng->state; 10219119bafbSConrad Meyer pcg_setseq_16_step_r(rng); 10229119bafbSConrad Meyer return pcg_output_xsh_rs_16_8(oldstate); 10239119bafbSConrad Meyer } 10249119bafbSConrad Meyer 10259119bafbSConrad Meyer inline uint8_t 10269119bafbSConrad Meyer pcg_setseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_setseq_16* rng, 10279119bafbSConrad Meyer uint8_t bound) 10289119bafbSConrad Meyer { 10299119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 10309119bafbSConrad Meyer for (;;) { 10319119bafbSConrad Meyer uint8_t r = pcg_setseq_16_xsh_rs_8_random_r(rng); 10329119bafbSConrad Meyer if (r >= threshold) 10339119bafbSConrad Meyer return r % bound; 10349119bafbSConrad Meyer } 10359119bafbSConrad Meyer } 10369119bafbSConrad Meyer 10379119bafbSConrad Meyer inline uint16_t 10389119bafbSConrad Meyer pcg_setseq_32_xsh_rs_16_random_r(struct pcg_state_setseq_32* rng) 10399119bafbSConrad Meyer { 10409119bafbSConrad Meyer uint32_t oldstate = rng->state; 10419119bafbSConrad Meyer pcg_setseq_32_step_r(rng); 10429119bafbSConrad Meyer return pcg_output_xsh_rs_32_16(oldstate); 10439119bafbSConrad Meyer } 10449119bafbSConrad Meyer 10459119bafbSConrad Meyer inline uint16_t 10469119bafbSConrad Meyer pcg_setseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_setseq_32* rng, 10479119bafbSConrad Meyer uint16_t bound) 10489119bafbSConrad Meyer { 10499119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 10509119bafbSConrad Meyer for (;;) { 10519119bafbSConrad Meyer uint16_t r = pcg_setseq_32_xsh_rs_16_random_r(rng); 10529119bafbSConrad Meyer if (r >= threshold) 10539119bafbSConrad Meyer return r % bound; 10549119bafbSConrad Meyer } 10559119bafbSConrad Meyer } 10569119bafbSConrad Meyer 10579119bafbSConrad Meyer inline uint32_t 10589119bafbSConrad Meyer pcg_setseq_64_xsh_rs_32_random_r(struct pcg_state_setseq_64* rng) 10599119bafbSConrad Meyer { 10609119bafbSConrad Meyer uint64_t oldstate = rng->state; 10619119bafbSConrad Meyer pcg_setseq_64_step_r(rng); 10629119bafbSConrad Meyer return pcg_output_xsh_rs_64_32(oldstate); 10639119bafbSConrad Meyer } 10649119bafbSConrad Meyer 10659119bafbSConrad Meyer inline uint32_t 10669119bafbSConrad Meyer pcg_setseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_setseq_64* rng, 10679119bafbSConrad Meyer uint32_t bound) 10689119bafbSConrad Meyer { 10699119bafbSConrad Meyer uint32_t threshold = -bound % bound; 10709119bafbSConrad Meyer for (;;) { 10719119bafbSConrad Meyer uint32_t r = pcg_setseq_64_xsh_rs_32_random_r(rng); 10729119bafbSConrad Meyer if (r >= threshold) 10739119bafbSConrad Meyer return r % bound; 10749119bafbSConrad Meyer } 10759119bafbSConrad Meyer } 10769119bafbSConrad Meyer 10779119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 10789119bafbSConrad Meyer inline uint64_t 10799119bafbSConrad Meyer pcg_setseq_128_xsh_rs_64_random_r(struct pcg_state_setseq_128* rng) 10809119bafbSConrad Meyer { 10819119bafbSConrad Meyer pcg_setseq_128_step_r(rng); 10829119bafbSConrad Meyer return pcg_output_xsh_rs_128_64(rng->state); 10839119bafbSConrad Meyer } 10849119bafbSConrad Meyer #endif 10859119bafbSConrad Meyer 10869119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 10879119bafbSConrad Meyer inline uint64_t 10889119bafbSConrad Meyer pcg_setseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_setseq_128* rng, 10899119bafbSConrad Meyer uint64_t bound) 10909119bafbSConrad Meyer { 10919119bafbSConrad Meyer uint64_t threshold = -bound % bound; 10929119bafbSConrad Meyer for (;;) { 10939119bafbSConrad Meyer uint64_t r = pcg_setseq_128_xsh_rs_64_random_r(rng); 10949119bafbSConrad Meyer if (r >= threshold) 10959119bafbSConrad Meyer return r % bound; 10969119bafbSConrad Meyer } 10979119bafbSConrad Meyer } 10989119bafbSConrad Meyer #endif 10999119bafbSConrad Meyer 11009119bafbSConrad Meyer inline uint8_t pcg_mcg_16_xsh_rs_8_random_r(struct pcg_state_16* rng) 11019119bafbSConrad Meyer { 11029119bafbSConrad Meyer uint16_t oldstate = rng->state; 11039119bafbSConrad Meyer pcg_mcg_16_step_r(rng); 11049119bafbSConrad Meyer return pcg_output_xsh_rs_16_8(oldstate); 11059119bafbSConrad Meyer } 11069119bafbSConrad Meyer 11079119bafbSConrad Meyer inline uint8_t pcg_mcg_16_xsh_rs_8_boundedrand_r(struct pcg_state_16* rng, 11089119bafbSConrad Meyer uint8_t bound) 11099119bafbSConrad Meyer { 11109119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 11119119bafbSConrad Meyer for (;;) { 11129119bafbSConrad Meyer uint8_t r = pcg_mcg_16_xsh_rs_8_random_r(rng); 11139119bafbSConrad Meyer if (r >= threshold) 11149119bafbSConrad Meyer return r % bound; 11159119bafbSConrad Meyer } 11169119bafbSConrad Meyer } 11179119bafbSConrad Meyer 11189119bafbSConrad Meyer inline uint16_t pcg_mcg_32_xsh_rs_16_random_r(struct pcg_state_32* rng) 11199119bafbSConrad Meyer { 11209119bafbSConrad Meyer uint32_t oldstate = rng->state; 11219119bafbSConrad Meyer pcg_mcg_32_step_r(rng); 11229119bafbSConrad Meyer return pcg_output_xsh_rs_32_16(oldstate); 11239119bafbSConrad Meyer } 11249119bafbSConrad Meyer 11259119bafbSConrad Meyer inline uint16_t pcg_mcg_32_xsh_rs_16_boundedrand_r(struct pcg_state_32* rng, 11269119bafbSConrad Meyer uint16_t bound) 11279119bafbSConrad Meyer { 11289119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 11299119bafbSConrad Meyer for (;;) { 11309119bafbSConrad Meyer uint16_t r = pcg_mcg_32_xsh_rs_16_random_r(rng); 11319119bafbSConrad Meyer if (r >= threshold) 11329119bafbSConrad Meyer return r % bound; 11339119bafbSConrad Meyer } 11349119bafbSConrad Meyer } 11359119bafbSConrad Meyer 11369119bafbSConrad Meyer inline uint32_t pcg_mcg_64_xsh_rs_32_random_r(struct pcg_state_64* rng) 11379119bafbSConrad Meyer { 11389119bafbSConrad Meyer uint64_t oldstate = rng->state; 11399119bafbSConrad Meyer pcg_mcg_64_step_r(rng); 11409119bafbSConrad Meyer return pcg_output_xsh_rs_64_32(oldstate); 11419119bafbSConrad Meyer } 11429119bafbSConrad Meyer 11439119bafbSConrad Meyer inline uint32_t pcg_mcg_64_xsh_rs_32_boundedrand_r(struct pcg_state_64* rng, 11449119bafbSConrad Meyer uint32_t bound) 11459119bafbSConrad Meyer { 11469119bafbSConrad Meyer uint32_t threshold = -bound % bound; 11479119bafbSConrad Meyer for (;;) { 11489119bafbSConrad Meyer uint32_t r = pcg_mcg_64_xsh_rs_32_random_r(rng); 11499119bafbSConrad Meyer if (r >= threshold) 11509119bafbSConrad Meyer return r % bound; 11519119bafbSConrad Meyer } 11529119bafbSConrad Meyer } 11539119bafbSConrad Meyer 11549119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 11559119bafbSConrad Meyer inline uint64_t pcg_mcg_128_xsh_rs_64_random_r(struct pcg_state_128* rng) 11569119bafbSConrad Meyer { 11579119bafbSConrad Meyer pcg_mcg_128_step_r(rng); 11589119bafbSConrad Meyer return pcg_output_xsh_rs_128_64(rng->state); 11599119bafbSConrad Meyer } 11609119bafbSConrad Meyer #endif 11619119bafbSConrad Meyer 11629119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 11639119bafbSConrad Meyer inline uint64_t pcg_mcg_128_xsh_rs_64_boundedrand_r(struct pcg_state_128* rng, 11649119bafbSConrad Meyer uint64_t bound) 11659119bafbSConrad Meyer { 11669119bafbSConrad Meyer uint64_t threshold = -bound % bound; 11679119bafbSConrad Meyer for (;;) { 11689119bafbSConrad Meyer uint64_t r = pcg_mcg_128_xsh_rs_64_random_r(rng); 11699119bafbSConrad Meyer if (r >= threshold) 11709119bafbSConrad Meyer return r % bound; 11719119bafbSConrad Meyer } 11729119bafbSConrad Meyer } 11739119bafbSConrad Meyer #endif 11749119bafbSConrad Meyer 11759119bafbSConrad Meyer /* Generation functions for XSH RR */ 11769119bafbSConrad Meyer 11779119bafbSConrad Meyer inline uint8_t pcg_oneseq_16_xsh_rr_8_random_r(struct pcg_state_16* rng) 11789119bafbSConrad Meyer { 11799119bafbSConrad Meyer uint16_t oldstate = rng->state; 11809119bafbSConrad Meyer pcg_oneseq_16_step_r(rng); 11819119bafbSConrad Meyer return pcg_output_xsh_rr_16_8(oldstate); 11829119bafbSConrad Meyer } 11839119bafbSConrad Meyer 11849119bafbSConrad Meyer inline uint8_t pcg_oneseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_16* rng, 11859119bafbSConrad Meyer uint8_t bound) 11869119bafbSConrad Meyer { 11879119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 11889119bafbSConrad Meyer for (;;) { 11899119bafbSConrad Meyer uint8_t r = pcg_oneseq_16_xsh_rr_8_random_r(rng); 11909119bafbSConrad Meyer if (r >= threshold) 11919119bafbSConrad Meyer return r % bound; 11929119bafbSConrad Meyer } 11939119bafbSConrad Meyer } 11949119bafbSConrad Meyer 11959119bafbSConrad Meyer inline uint16_t pcg_oneseq_32_xsh_rr_16_random_r(struct pcg_state_32* rng) 11969119bafbSConrad Meyer { 11979119bafbSConrad Meyer uint32_t oldstate = rng->state; 11989119bafbSConrad Meyer pcg_oneseq_32_step_r(rng); 11999119bafbSConrad Meyer return pcg_output_xsh_rr_32_16(oldstate); 12009119bafbSConrad Meyer } 12019119bafbSConrad Meyer 12029119bafbSConrad Meyer inline uint16_t pcg_oneseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_32* rng, 12039119bafbSConrad Meyer uint16_t bound) 12049119bafbSConrad Meyer { 12059119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 12069119bafbSConrad Meyer for (;;) { 12079119bafbSConrad Meyer uint16_t r = pcg_oneseq_32_xsh_rr_16_random_r(rng); 12089119bafbSConrad Meyer if (r >= threshold) 12099119bafbSConrad Meyer return r % bound; 12109119bafbSConrad Meyer } 12119119bafbSConrad Meyer } 12129119bafbSConrad Meyer 12139119bafbSConrad Meyer inline uint32_t pcg_oneseq_64_xsh_rr_32_random_r(struct pcg_state_64* rng) 12149119bafbSConrad Meyer { 12159119bafbSConrad Meyer uint64_t oldstate = rng->state; 12169119bafbSConrad Meyer pcg_oneseq_64_step_r(rng); 12179119bafbSConrad Meyer return pcg_output_xsh_rr_64_32(oldstate); 12189119bafbSConrad Meyer } 12199119bafbSConrad Meyer 12209119bafbSConrad Meyer inline uint32_t pcg_oneseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_64* rng, 12219119bafbSConrad Meyer uint32_t bound) 12229119bafbSConrad Meyer { 12239119bafbSConrad Meyer uint32_t threshold = -bound % bound; 12249119bafbSConrad Meyer for (;;) { 12259119bafbSConrad Meyer uint32_t r = pcg_oneseq_64_xsh_rr_32_random_r(rng); 12269119bafbSConrad Meyer if (r >= threshold) 12279119bafbSConrad Meyer return r % bound; 12289119bafbSConrad Meyer } 12299119bafbSConrad Meyer } 12309119bafbSConrad Meyer 12319119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 12329119bafbSConrad Meyer inline uint64_t pcg_oneseq_128_xsh_rr_64_random_r(struct pcg_state_128* rng) 12339119bafbSConrad Meyer { 12349119bafbSConrad Meyer pcg_oneseq_128_step_r(rng); 12359119bafbSConrad Meyer return pcg_output_xsh_rr_128_64(rng->state); 12369119bafbSConrad Meyer } 12379119bafbSConrad Meyer #endif 12389119bafbSConrad Meyer 12399119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 12409119bafbSConrad Meyer inline uint64_t 12419119bafbSConrad Meyer pcg_oneseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_128* rng, 12429119bafbSConrad Meyer uint64_t bound) 12439119bafbSConrad Meyer { 12449119bafbSConrad Meyer uint64_t threshold = -bound % bound; 12459119bafbSConrad Meyer for (;;) { 12469119bafbSConrad Meyer uint64_t r = pcg_oneseq_128_xsh_rr_64_random_r(rng); 12479119bafbSConrad Meyer if (r >= threshold) 12489119bafbSConrad Meyer return r % bound; 12499119bafbSConrad Meyer } 12509119bafbSConrad Meyer } 12519119bafbSConrad Meyer #endif 12529119bafbSConrad Meyer 12539119bafbSConrad Meyer inline uint8_t pcg_unique_16_xsh_rr_8_random_r(struct pcg_state_16* rng) 12549119bafbSConrad Meyer { 12559119bafbSConrad Meyer uint16_t oldstate = rng->state; 12569119bafbSConrad Meyer pcg_unique_16_step_r(rng); 12579119bafbSConrad Meyer return pcg_output_xsh_rr_16_8(oldstate); 12589119bafbSConrad Meyer } 12599119bafbSConrad Meyer 12609119bafbSConrad Meyer inline uint8_t pcg_unique_16_xsh_rr_8_boundedrand_r(struct pcg_state_16* rng, 12619119bafbSConrad Meyer uint8_t bound) 12629119bafbSConrad Meyer { 12639119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 12649119bafbSConrad Meyer for (;;) { 12659119bafbSConrad Meyer uint8_t r = pcg_unique_16_xsh_rr_8_random_r(rng); 12669119bafbSConrad Meyer if (r >= threshold) 12679119bafbSConrad Meyer return r % bound; 12689119bafbSConrad Meyer } 12699119bafbSConrad Meyer } 12709119bafbSConrad Meyer 12719119bafbSConrad Meyer inline uint16_t pcg_unique_32_xsh_rr_16_random_r(struct pcg_state_32* rng) 12729119bafbSConrad Meyer { 12739119bafbSConrad Meyer uint32_t oldstate = rng->state; 12749119bafbSConrad Meyer pcg_unique_32_step_r(rng); 12759119bafbSConrad Meyer return pcg_output_xsh_rr_32_16(oldstate); 12769119bafbSConrad Meyer } 12779119bafbSConrad Meyer 12789119bafbSConrad Meyer inline uint16_t pcg_unique_32_xsh_rr_16_boundedrand_r(struct pcg_state_32* rng, 12799119bafbSConrad Meyer uint16_t bound) 12809119bafbSConrad Meyer { 12819119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 12829119bafbSConrad Meyer for (;;) { 12839119bafbSConrad Meyer uint16_t r = pcg_unique_32_xsh_rr_16_random_r(rng); 12849119bafbSConrad Meyer if (r >= threshold) 12859119bafbSConrad Meyer return r % bound; 12869119bafbSConrad Meyer } 12879119bafbSConrad Meyer } 12889119bafbSConrad Meyer 12899119bafbSConrad Meyer inline uint32_t pcg_unique_64_xsh_rr_32_random_r(struct pcg_state_64* rng) 12909119bafbSConrad Meyer { 12919119bafbSConrad Meyer uint64_t oldstate = rng->state; 12929119bafbSConrad Meyer pcg_unique_64_step_r(rng); 12939119bafbSConrad Meyer return pcg_output_xsh_rr_64_32(oldstate); 12949119bafbSConrad Meyer } 12959119bafbSConrad Meyer 12969119bafbSConrad Meyer inline uint32_t pcg_unique_64_xsh_rr_32_boundedrand_r(struct pcg_state_64* rng, 12979119bafbSConrad Meyer uint32_t bound) 12989119bafbSConrad Meyer { 12999119bafbSConrad Meyer uint32_t threshold = -bound % bound; 13009119bafbSConrad Meyer for (;;) { 13019119bafbSConrad Meyer uint32_t r = pcg_unique_64_xsh_rr_32_random_r(rng); 13029119bafbSConrad Meyer if (r >= threshold) 13039119bafbSConrad Meyer return r % bound; 13049119bafbSConrad Meyer } 13059119bafbSConrad Meyer } 13069119bafbSConrad Meyer 13079119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 13089119bafbSConrad Meyer inline uint64_t pcg_unique_128_xsh_rr_64_random_r(struct pcg_state_128* rng) 13099119bafbSConrad Meyer { 13109119bafbSConrad Meyer pcg_unique_128_step_r(rng); 13119119bafbSConrad Meyer return pcg_output_xsh_rr_128_64(rng->state); 13129119bafbSConrad Meyer } 13139119bafbSConrad Meyer #endif 13149119bafbSConrad Meyer 13159119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 13169119bafbSConrad Meyer inline uint64_t 13179119bafbSConrad Meyer pcg_unique_128_xsh_rr_64_boundedrand_r(struct pcg_state_128* rng, 13189119bafbSConrad Meyer uint64_t bound) 13199119bafbSConrad Meyer { 13209119bafbSConrad Meyer uint64_t threshold = -bound % bound; 13219119bafbSConrad Meyer for (;;) { 13229119bafbSConrad Meyer uint64_t r = pcg_unique_128_xsh_rr_64_random_r(rng); 13239119bafbSConrad Meyer if (r >= threshold) 13249119bafbSConrad Meyer return r % bound; 13259119bafbSConrad Meyer } 13269119bafbSConrad Meyer } 13279119bafbSConrad Meyer #endif 13289119bafbSConrad Meyer 13299119bafbSConrad Meyer inline uint8_t pcg_setseq_16_xsh_rr_8_random_r(struct pcg_state_setseq_16* rng) 13309119bafbSConrad Meyer { 13319119bafbSConrad Meyer uint16_t oldstate = rng->state; 13329119bafbSConrad Meyer pcg_setseq_16_step_r(rng); 13339119bafbSConrad Meyer return pcg_output_xsh_rr_16_8(oldstate); 13349119bafbSConrad Meyer } 13359119bafbSConrad Meyer 13369119bafbSConrad Meyer inline uint8_t 13379119bafbSConrad Meyer pcg_setseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_setseq_16* rng, 13389119bafbSConrad Meyer uint8_t bound) 13399119bafbSConrad Meyer { 13409119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 13419119bafbSConrad Meyer for (;;) { 13429119bafbSConrad Meyer uint8_t r = pcg_setseq_16_xsh_rr_8_random_r(rng); 13439119bafbSConrad Meyer if (r >= threshold) 13449119bafbSConrad Meyer return r % bound; 13459119bafbSConrad Meyer } 13469119bafbSConrad Meyer } 13479119bafbSConrad Meyer 13489119bafbSConrad Meyer inline uint16_t 13499119bafbSConrad Meyer pcg_setseq_32_xsh_rr_16_random_r(struct pcg_state_setseq_32* rng) 13509119bafbSConrad Meyer { 13519119bafbSConrad Meyer uint32_t oldstate = rng->state; 13529119bafbSConrad Meyer pcg_setseq_32_step_r(rng); 13539119bafbSConrad Meyer return pcg_output_xsh_rr_32_16(oldstate); 13549119bafbSConrad Meyer } 13559119bafbSConrad Meyer 13569119bafbSConrad Meyer inline uint16_t 13579119bafbSConrad Meyer pcg_setseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_setseq_32* rng, 13589119bafbSConrad Meyer uint16_t bound) 13599119bafbSConrad Meyer { 13609119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 13619119bafbSConrad Meyer for (;;) { 13629119bafbSConrad Meyer uint16_t r = pcg_setseq_32_xsh_rr_16_random_r(rng); 13639119bafbSConrad Meyer if (r >= threshold) 13649119bafbSConrad Meyer return r % bound; 13659119bafbSConrad Meyer } 13669119bafbSConrad Meyer } 13679119bafbSConrad Meyer 13689119bafbSConrad Meyer inline uint32_t 13699119bafbSConrad Meyer pcg_setseq_64_xsh_rr_32_random_r(struct pcg_state_setseq_64* rng) 13709119bafbSConrad Meyer { 13719119bafbSConrad Meyer uint64_t oldstate = rng->state; 13729119bafbSConrad Meyer pcg_setseq_64_step_r(rng); 13739119bafbSConrad Meyer return pcg_output_xsh_rr_64_32(oldstate); 13749119bafbSConrad Meyer } 13759119bafbSConrad Meyer 13769119bafbSConrad Meyer inline uint32_t 13779119bafbSConrad Meyer pcg_setseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_setseq_64* rng, 13789119bafbSConrad Meyer uint32_t bound) 13799119bafbSConrad Meyer { 13809119bafbSConrad Meyer uint32_t threshold = -bound % bound; 13819119bafbSConrad Meyer for (;;) { 13829119bafbSConrad Meyer uint32_t r = pcg_setseq_64_xsh_rr_32_random_r(rng); 13839119bafbSConrad Meyer if (r >= threshold) 13849119bafbSConrad Meyer return r % bound; 13859119bafbSConrad Meyer } 13869119bafbSConrad Meyer } 13879119bafbSConrad Meyer 13889119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 13899119bafbSConrad Meyer inline uint64_t 13909119bafbSConrad Meyer pcg_setseq_128_xsh_rr_64_random_r(struct pcg_state_setseq_128* rng) 13919119bafbSConrad Meyer { 13929119bafbSConrad Meyer pcg_setseq_128_step_r(rng); 13939119bafbSConrad Meyer return pcg_output_xsh_rr_128_64(rng->state); 13949119bafbSConrad Meyer } 13959119bafbSConrad Meyer #endif 13969119bafbSConrad Meyer 13979119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 13989119bafbSConrad Meyer inline uint64_t 13999119bafbSConrad Meyer pcg_setseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_setseq_128* rng, 14009119bafbSConrad Meyer uint64_t bound) 14019119bafbSConrad Meyer { 14029119bafbSConrad Meyer uint64_t threshold = -bound % bound; 14039119bafbSConrad Meyer for (;;) { 14049119bafbSConrad Meyer uint64_t r = pcg_setseq_128_xsh_rr_64_random_r(rng); 14059119bafbSConrad Meyer if (r >= threshold) 14069119bafbSConrad Meyer return r % bound; 14079119bafbSConrad Meyer } 14089119bafbSConrad Meyer } 14099119bafbSConrad Meyer #endif 14109119bafbSConrad Meyer 14119119bafbSConrad Meyer inline uint8_t pcg_mcg_16_xsh_rr_8_random_r(struct pcg_state_16* rng) 14129119bafbSConrad Meyer { 14139119bafbSConrad Meyer uint16_t oldstate = rng->state; 14149119bafbSConrad Meyer pcg_mcg_16_step_r(rng); 14159119bafbSConrad Meyer return pcg_output_xsh_rr_16_8(oldstate); 14169119bafbSConrad Meyer } 14179119bafbSConrad Meyer 14189119bafbSConrad Meyer inline uint8_t pcg_mcg_16_xsh_rr_8_boundedrand_r(struct pcg_state_16* rng, 14199119bafbSConrad Meyer uint8_t bound) 14209119bafbSConrad Meyer { 14219119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 14229119bafbSConrad Meyer for (;;) { 14239119bafbSConrad Meyer uint8_t r = pcg_mcg_16_xsh_rr_8_random_r(rng); 14249119bafbSConrad Meyer if (r >= threshold) 14259119bafbSConrad Meyer return r % bound; 14269119bafbSConrad Meyer } 14279119bafbSConrad Meyer } 14289119bafbSConrad Meyer 14299119bafbSConrad Meyer inline uint16_t pcg_mcg_32_xsh_rr_16_random_r(struct pcg_state_32* rng) 14309119bafbSConrad Meyer { 14319119bafbSConrad Meyer uint32_t oldstate = rng->state; 14329119bafbSConrad Meyer pcg_mcg_32_step_r(rng); 14339119bafbSConrad Meyer return pcg_output_xsh_rr_32_16(oldstate); 14349119bafbSConrad Meyer } 14359119bafbSConrad Meyer 14369119bafbSConrad Meyer inline uint16_t pcg_mcg_32_xsh_rr_16_boundedrand_r(struct pcg_state_32* rng, 14379119bafbSConrad Meyer uint16_t bound) 14389119bafbSConrad Meyer { 14399119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 14409119bafbSConrad Meyer for (;;) { 14419119bafbSConrad Meyer uint16_t r = pcg_mcg_32_xsh_rr_16_random_r(rng); 14429119bafbSConrad Meyer if (r >= threshold) 14439119bafbSConrad Meyer return r % bound; 14449119bafbSConrad Meyer } 14459119bafbSConrad Meyer } 14469119bafbSConrad Meyer 14479119bafbSConrad Meyer inline uint32_t pcg_mcg_64_xsh_rr_32_random_r(struct pcg_state_64* rng) 14489119bafbSConrad Meyer { 14499119bafbSConrad Meyer uint64_t oldstate = rng->state; 14509119bafbSConrad Meyer pcg_mcg_64_step_r(rng); 14519119bafbSConrad Meyer return pcg_output_xsh_rr_64_32(oldstate); 14529119bafbSConrad Meyer } 14539119bafbSConrad Meyer 14549119bafbSConrad Meyer inline uint32_t pcg_mcg_64_xsh_rr_32_boundedrand_r(struct pcg_state_64* rng, 14559119bafbSConrad Meyer uint32_t bound) 14569119bafbSConrad Meyer { 14579119bafbSConrad Meyer uint32_t threshold = -bound % bound; 14589119bafbSConrad Meyer for (;;) { 14599119bafbSConrad Meyer uint32_t r = pcg_mcg_64_xsh_rr_32_random_r(rng); 14609119bafbSConrad Meyer if (r >= threshold) 14619119bafbSConrad Meyer return r % bound; 14629119bafbSConrad Meyer } 14639119bafbSConrad Meyer } 14649119bafbSConrad Meyer 14659119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 14669119bafbSConrad Meyer inline uint64_t pcg_mcg_128_xsh_rr_64_random_r(struct pcg_state_128* rng) 14679119bafbSConrad Meyer { 14689119bafbSConrad Meyer pcg_mcg_128_step_r(rng); 14699119bafbSConrad Meyer return pcg_output_xsh_rr_128_64(rng->state); 14709119bafbSConrad Meyer } 14719119bafbSConrad Meyer #endif 14729119bafbSConrad Meyer 14739119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 14749119bafbSConrad Meyer inline uint64_t pcg_mcg_128_xsh_rr_64_boundedrand_r(struct pcg_state_128* rng, 14759119bafbSConrad Meyer uint64_t bound) 14769119bafbSConrad Meyer { 14779119bafbSConrad Meyer uint64_t threshold = -bound % bound; 14789119bafbSConrad Meyer for (;;) { 14799119bafbSConrad Meyer uint64_t r = pcg_mcg_128_xsh_rr_64_random_r(rng); 14809119bafbSConrad Meyer if (r >= threshold) 14819119bafbSConrad Meyer return r % bound; 14829119bafbSConrad Meyer } 14839119bafbSConrad Meyer } 14849119bafbSConrad Meyer #endif 14859119bafbSConrad Meyer 14869119bafbSConrad Meyer /* Generation functions for RXS M XS (no MCG versions because they 14879119bafbSConrad Meyer * don't make sense when you want to use the entire state) 14889119bafbSConrad Meyer */ 14899119bafbSConrad Meyer 14909119bafbSConrad Meyer inline uint8_t pcg_oneseq_8_rxs_m_xs_8_random_r(struct pcg_state_8* rng) 14919119bafbSConrad Meyer { 14929119bafbSConrad Meyer uint8_t oldstate = rng->state; 14939119bafbSConrad Meyer pcg_oneseq_8_step_r(rng); 14949119bafbSConrad Meyer return pcg_output_rxs_m_xs_8_8(oldstate); 14959119bafbSConrad Meyer } 14969119bafbSConrad Meyer 14979119bafbSConrad Meyer inline uint8_t pcg_oneseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_8* rng, 14989119bafbSConrad Meyer uint8_t bound) 14999119bafbSConrad Meyer { 15009119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 15019119bafbSConrad Meyer for (;;) { 15029119bafbSConrad Meyer uint8_t r = pcg_oneseq_8_rxs_m_xs_8_random_r(rng); 15039119bafbSConrad Meyer if (r >= threshold) 15049119bafbSConrad Meyer return r % bound; 15059119bafbSConrad Meyer } 15069119bafbSConrad Meyer } 15079119bafbSConrad Meyer 15089119bafbSConrad Meyer inline uint16_t pcg_oneseq_16_rxs_m_xs_16_random_r(struct pcg_state_16* rng) 15099119bafbSConrad Meyer { 15109119bafbSConrad Meyer uint16_t oldstate = rng->state; 15119119bafbSConrad Meyer pcg_oneseq_16_step_r(rng); 15129119bafbSConrad Meyer return pcg_output_rxs_m_xs_16_16(oldstate); 15139119bafbSConrad Meyer } 15149119bafbSConrad Meyer 15159119bafbSConrad Meyer inline uint16_t 15169119bafbSConrad Meyer pcg_oneseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16* rng, 15179119bafbSConrad Meyer uint16_t bound) 15189119bafbSConrad Meyer { 15199119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 15209119bafbSConrad Meyer for (;;) { 15219119bafbSConrad Meyer uint16_t r = pcg_oneseq_16_rxs_m_xs_16_random_r(rng); 15229119bafbSConrad Meyer if (r >= threshold) 15239119bafbSConrad Meyer return r % bound; 15249119bafbSConrad Meyer } 15259119bafbSConrad Meyer } 15269119bafbSConrad Meyer 15279119bafbSConrad Meyer inline uint32_t pcg_oneseq_32_rxs_m_xs_32_random_r(struct pcg_state_32* rng) 15289119bafbSConrad Meyer { 15299119bafbSConrad Meyer uint32_t oldstate = rng->state; 15309119bafbSConrad Meyer pcg_oneseq_32_step_r(rng); 15319119bafbSConrad Meyer return pcg_output_rxs_m_xs_32_32(oldstate); 15329119bafbSConrad Meyer } 15339119bafbSConrad Meyer 15349119bafbSConrad Meyer inline uint32_t 15359119bafbSConrad Meyer pcg_oneseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32* rng, 15369119bafbSConrad Meyer uint32_t bound) 15379119bafbSConrad Meyer { 15389119bafbSConrad Meyer uint32_t threshold = -bound % bound; 15399119bafbSConrad Meyer for (;;) { 15409119bafbSConrad Meyer uint32_t r = pcg_oneseq_32_rxs_m_xs_32_random_r(rng); 15419119bafbSConrad Meyer if (r >= threshold) 15429119bafbSConrad Meyer return r % bound; 15439119bafbSConrad Meyer } 15449119bafbSConrad Meyer } 15459119bafbSConrad Meyer 15469119bafbSConrad Meyer inline uint64_t pcg_oneseq_64_rxs_m_xs_64_random_r(struct pcg_state_64* rng) 15479119bafbSConrad Meyer { 15489119bafbSConrad Meyer uint64_t oldstate = rng->state; 15499119bafbSConrad Meyer pcg_oneseq_64_step_r(rng); 15509119bafbSConrad Meyer return pcg_output_rxs_m_xs_64_64(oldstate); 15519119bafbSConrad Meyer } 15529119bafbSConrad Meyer 15539119bafbSConrad Meyer inline uint64_t 15549119bafbSConrad Meyer pcg_oneseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64* rng, 15559119bafbSConrad Meyer uint64_t bound) 15569119bafbSConrad Meyer { 15579119bafbSConrad Meyer uint64_t threshold = -bound % bound; 15589119bafbSConrad Meyer for (;;) { 15599119bafbSConrad Meyer uint64_t r = pcg_oneseq_64_rxs_m_xs_64_random_r(rng); 15609119bafbSConrad Meyer if (r >= threshold) 15619119bafbSConrad Meyer return r % bound; 15629119bafbSConrad Meyer } 15639119bafbSConrad Meyer } 15649119bafbSConrad Meyer 15659119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 15669119bafbSConrad Meyer inline pcg128_t pcg_oneseq_128_rxs_m_xs_128_random_r(struct pcg_state_128* rng) 15679119bafbSConrad Meyer { 15689119bafbSConrad Meyer pcg_oneseq_128_step_r(rng); 15699119bafbSConrad Meyer return pcg_output_rxs_m_xs_128_128(rng->state); 15709119bafbSConrad Meyer } 15719119bafbSConrad Meyer #endif 15729119bafbSConrad Meyer 15739119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 15749119bafbSConrad Meyer inline pcg128_t 15759119bafbSConrad Meyer pcg_oneseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128* rng, 15769119bafbSConrad Meyer pcg128_t bound) 15779119bafbSConrad Meyer { 15789119bafbSConrad Meyer pcg128_t threshold = -bound % bound; 15799119bafbSConrad Meyer for (;;) { 15809119bafbSConrad Meyer pcg128_t r = pcg_oneseq_128_rxs_m_xs_128_random_r(rng); 15819119bafbSConrad Meyer if (r >= threshold) 15829119bafbSConrad Meyer return r % bound; 15839119bafbSConrad Meyer } 15849119bafbSConrad Meyer } 15859119bafbSConrad Meyer #endif 15869119bafbSConrad Meyer 15879119bafbSConrad Meyer inline uint16_t pcg_unique_16_rxs_m_xs_16_random_r(struct pcg_state_16* rng) 15889119bafbSConrad Meyer { 15899119bafbSConrad Meyer uint16_t oldstate = rng->state; 15909119bafbSConrad Meyer pcg_unique_16_step_r(rng); 15919119bafbSConrad Meyer return pcg_output_rxs_m_xs_16_16(oldstate); 15929119bafbSConrad Meyer } 15939119bafbSConrad Meyer 15949119bafbSConrad Meyer inline uint16_t 15959119bafbSConrad Meyer pcg_unique_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16* rng, 15969119bafbSConrad Meyer uint16_t bound) 15979119bafbSConrad Meyer { 15989119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 15999119bafbSConrad Meyer for (;;) { 16009119bafbSConrad Meyer uint16_t r = pcg_unique_16_rxs_m_xs_16_random_r(rng); 16019119bafbSConrad Meyer if (r >= threshold) 16029119bafbSConrad Meyer return r % bound; 16039119bafbSConrad Meyer } 16049119bafbSConrad Meyer } 16059119bafbSConrad Meyer 16069119bafbSConrad Meyer inline uint32_t pcg_unique_32_rxs_m_xs_32_random_r(struct pcg_state_32* rng) 16079119bafbSConrad Meyer { 16089119bafbSConrad Meyer uint32_t oldstate = rng->state; 16099119bafbSConrad Meyer pcg_unique_32_step_r(rng); 16109119bafbSConrad Meyer return pcg_output_rxs_m_xs_32_32(oldstate); 16119119bafbSConrad Meyer } 16129119bafbSConrad Meyer 16139119bafbSConrad Meyer inline uint32_t 16149119bafbSConrad Meyer pcg_unique_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32* rng, 16159119bafbSConrad Meyer uint32_t bound) 16169119bafbSConrad Meyer { 16179119bafbSConrad Meyer uint32_t threshold = -bound % bound; 16189119bafbSConrad Meyer for (;;) { 16199119bafbSConrad Meyer uint32_t r = pcg_unique_32_rxs_m_xs_32_random_r(rng); 16209119bafbSConrad Meyer if (r >= threshold) 16219119bafbSConrad Meyer return r % bound; 16229119bafbSConrad Meyer } 16239119bafbSConrad Meyer } 16249119bafbSConrad Meyer 16259119bafbSConrad Meyer inline uint64_t pcg_unique_64_rxs_m_xs_64_random_r(struct pcg_state_64* rng) 16269119bafbSConrad Meyer { 16279119bafbSConrad Meyer uint64_t oldstate = rng->state; 16289119bafbSConrad Meyer pcg_unique_64_step_r(rng); 16299119bafbSConrad Meyer return pcg_output_rxs_m_xs_64_64(oldstate); 16309119bafbSConrad Meyer } 16319119bafbSConrad Meyer 16329119bafbSConrad Meyer inline uint64_t 16339119bafbSConrad Meyer pcg_unique_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64* rng, 16349119bafbSConrad Meyer uint64_t bound) 16359119bafbSConrad Meyer { 16369119bafbSConrad Meyer uint64_t threshold = -bound % bound; 16379119bafbSConrad Meyer for (;;) { 16389119bafbSConrad Meyer uint64_t r = pcg_unique_64_rxs_m_xs_64_random_r(rng); 16399119bafbSConrad Meyer if (r >= threshold) 16409119bafbSConrad Meyer return r % bound; 16419119bafbSConrad Meyer } 16429119bafbSConrad Meyer } 16439119bafbSConrad Meyer 16449119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 16459119bafbSConrad Meyer inline pcg128_t pcg_unique_128_rxs_m_xs_128_random_r(struct pcg_state_128* rng) 16469119bafbSConrad Meyer { 16479119bafbSConrad Meyer pcg_unique_128_step_r(rng); 16489119bafbSConrad Meyer return pcg_output_rxs_m_xs_128_128(rng->state); 16499119bafbSConrad Meyer } 16509119bafbSConrad Meyer #endif 16519119bafbSConrad Meyer 16529119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 16539119bafbSConrad Meyer inline pcg128_t 16549119bafbSConrad Meyer pcg_unique_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128* rng, 16559119bafbSConrad Meyer pcg128_t bound) 16569119bafbSConrad Meyer { 16579119bafbSConrad Meyer pcg128_t threshold = -bound % bound; 16589119bafbSConrad Meyer for (;;) { 16599119bafbSConrad Meyer pcg128_t r = pcg_unique_128_rxs_m_xs_128_random_r(rng); 16609119bafbSConrad Meyer if (r >= threshold) 16619119bafbSConrad Meyer return r % bound; 16629119bafbSConrad Meyer } 16639119bafbSConrad Meyer } 16649119bafbSConrad Meyer #endif 16659119bafbSConrad Meyer 16669119bafbSConrad Meyer inline uint8_t pcg_setseq_8_rxs_m_xs_8_random_r(struct pcg_state_setseq_8* rng) 16679119bafbSConrad Meyer { 16689119bafbSConrad Meyer uint8_t oldstate = rng->state; 16699119bafbSConrad Meyer pcg_setseq_8_step_r(rng); 16709119bafbSConrad Meyer return pcg_output_rxs_m_xs_8_8(oldstate); 16719119bafbSConrad Meyer } 16729119bafbSConrad Meyer 16739119bafbSConrad Meyer inline uint8_t 16749119bafbSConrad Meyer pcg_setseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_setseq_8* rng, 16759119bafbSConrad Meyer uint8_t bound) 16769119bafbSConrad Meyer { 16779119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 16789119bafbSConrad Meyer for (;;) { 16799119bafbSConrad Meyer uint8_t r = pcg_setseq_8_rxs_m_xs_8_random_r(rng); 16809119bafbSConrad Meyer if (r >= threshold) 16819119bafbSConrad Meyer return r % bound; 16829119bafbSConrad Meyer } 16839119bafbSConrad Meyer } 16849119bafbSConrad Meyer 16859119bafbSConrad Meyer inline uint16_t 16869119bafbSConrad Meyer pcg_setseq_16_rxs_m_xs_16_random_r(struct pcg_state_setseq_16* rng) 16879119bafbSConrad Meyer { 16889119bafbSConrad Meyer uint16_t oldstate = rng->state; 16899119bafbSConrad Meyer pcg_setseq_16_step_r(rng); 16909119bafbSConrad Meyer return pcg_output_rxs_m_xs_16_16(oldstate); 16919119bafbSConrad Meyer } 16929119bafbSConrad Meyer 16939119bafbSConrad Meyer inline uint16_t 16949119bafbSConrad Meyer pcg_setseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_setseq_16* rng, 16959119bafbSConrad Meyer uint16_t bound) 16969119bafbSConrad Meyer { 16979119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 16989119bafbSConrad Meyer for (;;) { 16999119bafbSConrad Meyer uint16_t r = pcg_setseq_16_rxs_m_xs_16_random_r(rng); 17009119bafbSConrad Meyer if (r >= threshold) 17019119bafbSConrad Meyer return r % bound; 17029119bafbSConrad Meyer } 17039119bafbSConrad Meyer } 17049119bafbSConrad Meyer 17059119bafbSConrad Meyer inline uint32_t 17069119bafbSConrad Meyer pcg_setseq_32_rxs_m_xs_32_random_r(struct pcg_state_setseq_32* rng) 17079119bafbSConrad Meyer { 17089119bafbSConrad Meyer uint32_t oldstate = rng->state; 17099119bafbSConrad Meyer pcg_setseq_32_step_r(rng); 17109119bafbSConrad Meyer return pcg_output_rxs_m_xs_32_32(oldstate); 17119119bafbSConrad Meyer } 17129119bafbSConrad Meyer 17139119bafbSConrad Meyer inline uint32_t 17149119bafbSConrad Meyer pcg_setseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_setseq_32* rng, 17159119bafbSConrad Meyer uint32_t bound) 17169119bafbSConrad Meyer { 17179119bafbSConrad Meyer uint32_t threshold = -bound % bound; 17189119bafbSConrad Meyer for (;;) { 17199119bafbSConrad Meyer uint32_t r = pcg_setseq_32_rxs_m_xs_32_random_r(rng); 17209119bafbSConrad Meyer if (r >= threshold) 17219119bafbSConrad Meyer return r % bound; 17229119bafbSConrad Meyer } 17239119bafbSConrad Meyer } 17249119bafbSConrad Meyer 17259119bafbSConrad Meyer inline uint64_t 17269119bafbSConrad Meyer pcg_setseq_64_rxs_m_xs_64_random_r(struct pcg_state_setseq_64* rng) 17279119bafbSConrad Meyer { 17289119bafbSConrad Meyer uint64_t oldstate = rng->state; 17299119bafbSConrad Meyer pcg_setseq_64_step_r(rng); 17309119bafbSConrad Meyer return pcg_output_rxs_m_xs_64_64(oldstate); 17319119bafbSConrad Meyer } 17329119bafbSConrad Meyer 17339119bafbSConrad Meyer inline uint64_t 17349119bafbSConrad Meyer pcg_setseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_setseq_64* rng, 17359119bafbSConrad Meyer uint64_t bound) 17369119bafbSConrad Meyer { 17379119bafbSConrad Meyer uint64_t threshold = -bound % bound; 17389119bafbSConrad Meyer for (;;) { 17399119bafbSConrad Meyer uint64_t r = pcg_setseq_64_rxs_m_xs_64_random_r(rng); 17409119bafbSConrad Meyer if (r >= threshold) 17419119bafbSConrad Meyer return r % bound; 17429119bafbSConrad Meyer } 17439119bafbSConrad Meyer } 17449119bafbSConrad Meyer 17459119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 17469119bafbSConrad Meyer inline pcg128_t 17479119bafbSConrad Meyer pcg_setseq_128_rxs_m_xs_128_random_r(struct pcg_state_setseq_128* rng) 17489119bafbSConrad Meyer { 17499119bafbSConrad Meyer pcg_setseq_128_step_r(rng); 17509119bafbSConrad Meyer return pcg_output_rxs_m_xs_128_128(rng->state); 17519119bafbSConrad Meyer } 17529119bafbSConrad Meyer #endif 17539119bafbSConrad Meyer 17549119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 17559119bafbSConrad Meyer inline pcg128_t 17569119bafbSConrad Meyer pcg_setseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_setseq_128* rng, 17579119bafbSConrad Meyer pcg128_t bound) 17589119bafbSConrad Meyer { 17599119bafbSConrad Meyer pcg128_t threshold = -bound % bound; 17609119bafbSConrad Meyer for (;;) { 17619119bafbSConrad Meyer pcg128_t r = pcg_setseq_128_rxs_m_xs_128_random_r(rng); 17629119bafbSConrad Meyer if (r >= threshold) 17639119bafbSConrad Meyer return r % bound; 17649119bafbSConrad Meyer } 17659119bafbSConrad Meyer } 17669119bafbSConrad Meyer #endif 17679119bafbSConrad Meyer 17689119bafbSConrad Meyer /* Generation functions for RXS M */ 17699119bafbSConrad Meyer 17709119bafbSConrad Meyer inline uint8_t pcg_oneseq_16_rxs_m_8_random_r(struct pcg_state_16* rng) 17719119bafbSConrad Meyer { 17729119bafbSConrad Meyer uint16_t oldstate = rng->state; 17739119bafbSConrad Meyer pcg_oneseq_16_step_r(rng); 17749119bafbSConrad Meyer return pcg_output_rxs_m_16_8(oldstate); 17759119bafbSConrad Meyer } 17769119bafbSConrad Meyer 17779119bafbSConrad Meyer inline uint8_t pcg_oneseq_16_rxs_m_8_boundedrand_r(struct pcg_state_16* rng, 17789119bafbSConrad Meyer uint8_t bound) 17799119bafbSConrad Meyer { 17809119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 17819119bafbSConrad Meyer for (;;) { 17829119bafbSConrad Meyer uint8_t r = pcg_oneseq_16_rxs_m_8_random_r(rng); 17839119bafbSConrad Meyer if (r >= threshold) 17849119bafbSConrad Meyer return r % bound; 17859119bafbSConrad Meyer } 17869119bafbSConrad Meyer } 17879119bafbSConrad Meyer 17889119bafbSConrad Meyer inline uint16_t pcg_oneseq_32_rxs_m_16_random_r(struct pcg_state_32* rng) 17899119bafbSConrad Meyer { 17909119bafbSConrad Meyer uint32_t oldstate = rng->state; 17919119bafbSConrad Meyer pcg_oneseq_32_step_r(rng); 17929119bafbSConrad Meyer return pcg_output_rxs_m_32_16(oldstate); 17939119bafbSConrad Meyer } 17949119bafbSConrad Meyer 17959119bafbSConrad Meyer inline uint16_t pcg_oneseq_32_rxs_m_16_boundedrand_r(struct pcg_state_32* rng, 17969119bafbSConrad Meyer uint16_t bound) 17979119bafbSConrad Meyer { 17989119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 17999119bafbSConrad Meyer for (;;) { 18009119bafbSConrad Meyer uint16_t r = pcg_oneseq_32_rxs_m_16_random_r(rng); 18019119bafbSConrad Meyer if (r >= threshold) 18029119bafbSConrad Meyer return r % bound; 18039119bafbSConrad Meyer } 18049119bafbSConrad Meyer } 18059119bafbSConrad Meyer 18069119bafbSConrad Meyer inline uint32_t pcg_oneseq_64_rxs_m_32_random_r(struct pcg_state_64* rng) 18079119bafbSConrad Meyer { 18089119bafbSConrad Meyer uint64_t oldstate = rng->state; 18099119bafbSConrad Meyer pcg_oneseq_64_step_r(rng); 18109119bafbSConrad Meyer return pcg_output_rxs_m_64_32(oldstate); 18119119bafbSConrad Meyer } 18129119bafbSConrad Meyer 18139119bafbSConrad Meyer inline uint32_t pcg_oneseq_64_rxs_m_32_boundedrand_r(struct pcg_state_64* rng, 18149119bafbSConrad Meyer uint32_t bound) 18159119bafbSConrad Meyer { 18169119bafbSConrad Meyer uint32_t threshold = -bound % bound; 18179119bafbSConrad Meyer for (;;) { 18189119bafbSConrad Meyer uint32_t r = pcg_oneseq_64_rxs_m_32_random_r(rng); 18199119bafbSConrad Meyer if (r >= threshold) 18209119bafbSConrad Meyer return r % bound; 18219119bafbSConrad Meyer } 18229119bafbSConrad Meyer } 18239119bafbSConrad Meyer 18249119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 18259119bafbSConrad Meyer inline uint64_t pcg_oneseq_128_rxs_m_64_random_r(struct pcg_state_128* rng) 18269119bafbSConrad Meyer { 18279119bafbSConrad Meyer pcg_oneseq_128_step_r(rng); 18289119bafbSConrad Meyer return pcg_output_rxs_m_128_64(rng->state); 18299119bafbSConrad Meyer } 18309119bafbSConrad Meyer #endif 18319119bafbSConrad Meyer 18329119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 18339119bafbSConrad Meyer inline uint64_t pcg_oneseq_128_rxs_m_64_boundedrand_r(struct pcg_state_128* rng, 18349119bafbSConrad Meyer uint64_t bound) 18359119bafbSConrad Meyer { 18369119bafbSConrad Meyer uint64_t threshold = -bound % bound; 18379119bafbSConrad Meyer for (;;) { 18389119bafbSConrad Meyer uint64_t r = pcg_oneseq_128_rxs_m_64_random_r(rng); 18399119bafbSConrad Meyer if (r >= threshold) 18409119bafbSConrad Meyer return r % bound; 18419119bafbSConrad Meyer } 18429119bafbSConrad Meyer } 18439119bafbSConrad Meyer #endif 18449119bafbSConrad Meyer 18459119bafbSConrad Meyer inline uint8_t pcg_unique_16_rxs_m_8_random_r(struct pcg_state_16* rng) 18469119bafbSConrad Meyer { 18479119bafbSConrad Meyer uint16_t oldstate = rng->state; 18489119bafbSConrad Meyer pcg_unique_16_step_r(rng); 18499119bafbSConrad Meyer return pcg_output_rxs_m_16_8(oldstate); 18509119bafbSConrad Meyer } 18519119bafbSConrad Meyer 18529119bafbSConrad Meyer inline uint8_t pcg_unique_16_rxs_m_8_boundedrand_r(struct pcg_state_16* rng, 18539119bafbSConrad Meyer uint8_t bound) 18549119bafbSConrad Meyer { 18559119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 18569119bafbSConrad Meyer for (;;) { 18579119bafbSConrad Meyer uint8_t r = pcg_unique_16_rxs_m_8_random_r(rng); 18589119bafbSConrad Meyer if (r >= threshold) 18599119bafbSConrad Meyer return r % bound; 18609119bafbSConrad Meyer } 18619119bafbSConrad Meyer } 18629119bafbSConrad Meyer 18639119bafbSConrad Meyer inline uint16_t pcg_unique_32_rxs_m_16_random_r(struct pcg_state_32* rng) 18649119bafbSConrad Meyer { 18659119bafbSConrad Meyer uint32_t oldstate = rng->state; 18669119bafbSConrad Meyer pcg_unique_32_step_r(rng); 18679119bafbSConrad Meyer return pcg_output_rxs_m_32_16(oldstate); 18689119bafbSConrad Meyer } 18699119bafbSConrad Meyer 18709119bafbSConrad Meyer inline uint16_t pcg_unique_32_rxs_m_16_boundedrand_r(struct pcg_state_32* rng, 18719119bafbSConrad Meyer uint16_t bound) 18729119bafbSConrad Meyer { 18739119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 18749119bafbSConrad Meyer for (;;) { 18759119bafbSConrad Meyer uint16_t r = pcg_unique_32_rxs_m_16_random_r(rng); 18769119bafbSConrad Meyer if (r >= threshold) 18779119bafbSConrad Meyer return r % bound; 18789119bafbSConrad Meyer } 18799119bafbSConrad Meyer } 18809119bafbSConrad Meyer 18819119bafbSConrad Meyer inline uint32_t pcg_unique_64_rxs_m_32_random_r(struct pcg_state_64* rng) 18829119bafbSConrad Meyer { 18839119bafbSConrad Meyer uint64_t oldstate = rng->state; 18849119bafbSConrad Meyer pcg_unique_64_step_r(rng); 18859119bafbSConrad Meyer return pcg_output_rxs_m_64_32(oldstate); 18869119bafbSConrad Meyer } 18879119bafbSConrad Meyer 18889119bafbSConrad Meyer inline uint32_t pcg_unique_64_rxs_m_32_boundedrand_r(struct pcg_state_64* rng, 18899119bafbSConrad Meyer uint32_t bound) 18909119bafbSConrad Meyer { 18919119bafbSConrad Meyer uint32_t threshold = -bound % bound; 18929119bafbSConrad Meyer for (;;) { 18939119bafbSConrad Meyer uint32_t r = pcg_unique_64_rxs_m_32_random_r(rng); 18949119bafbSConrad Meyer if (r >= threshold) 18959119bafbSConrad Meyer return r % bound; 18969119bafbSConrad Meyer } 18979119bafbSConrad Meyer } 18989119bafbSConrad Meyer 18999119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 19009119bafbSConrad Meyer inline uint64_t pcg_unique_128_rxs_m_64_random_r(struct pcg_state_128* rng) 19019119bafbSConrad Meyer { 19029119bafbSConrad Meyer pcg_unique_128_step_r(rng); 19039119bafbSConrad Meyer return pcg_output_rxs_m_128_64(rng->state); 19049119bafbSConrad Meyer } 19059119bafbSConrad Meyer #endif 19069119bafbSConrad Meyer 19079119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 19089119bafbSConrad Meyer inline uint64_t pcg_unique_128_rxs_m_64_boundedrand_r(struct pcg_state_128* rng, 19099119bafbSConrad Meyer uint64_t bound) 19109119bafbSConrad Meyer { 19119119bafbSConrad Meyer uint64_t threshold = -bound % bound; 19129119bafbSConrad Meyer for (;;) { 19139119bafbSConrad Meyer uint64_t r = pcg_unique_128_rxs_m_64_random_r(rng); 19149119bafbSConrad Meyer if (r >= threshold) 19159119bafbSConrad Meyer return r % bound; 19169119bafbSConrad Meyer } 19179119bafbSConrad Meyer } 19189119bafbSConrad Meyer #endif 19199119bafbSConrad Meyer 19209119bafbSConrad Meyer inline uint8_t pcg_setseq_16_rxs_m_8_random_r(struct pcg_state_setseq_16* rng) 19219119bafbSConrad Meyer { 19229119bafbSConrad Meyer uint16_t oldstate = rng->state; 19239119bafbSConrad Meyer pcg_setseq_16_step_r(rng); 19249119bafbSConrad Meyer return pcg_output_rxs_m_16_8(oldstate); 19259119bafbSConrad Meyer } 19269119bafbSConrad Meyer 19279119bafbSConrad Meyer inline uint8_t 19289119bafbSConrad Meyer pcg_setseq_16_rxs_m_8_boundedrand_r(struct pcg_state_setseq_16* rng, 19299119bafbSConrad Meyer uint8_t bound) 19309119bafbSConrad Meyer { 19319119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 19329119bafbSConrad Meyer for (;;) { 19339119bafbSConrad Meyer uint8_t r = pcg_setseq_16_rxs_m_8_random_r(rng); 19349119bafbSConrad Meyer if (r >= threshold) 19359119bafbSConrad Meyer return r % bound; 19369119bafbSConrad Meyer } 19379119bafbSConrad Meyer } 19389119bafbSConrad Meyer 19399119bafbSConrad Meyer inline uint16_t pcg_setseq_32_rxs_m_16_random_r(struct pcg_state_setseq_32* rng) 19409119bafbSConrad Meyer { 19419119bafbSConrad Meyer uint32_t oldstate = rng->state; 19429119bafbSConrad Meyer pcg_setseq_32_step_r(rng); 19439119bafbSConrad Meyer return pcg_output_rxs_m_32_16(oldstate); 19449119bafbSConrad Meyer } 19459119bafbSConrad Meyer 19469119bafbSConrad Meyer inline uint16_t 19479119bafbSConrad Meyer pcg_setseq_32_rxs_m_16_boundedrand_r(struct pcg_state_setseq_32* rng, 19489119bafbSConrad Meyer uint16_t bound) 19499119bafbSConrad Meyer { 19509119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 19519119bafbSConrad Meyer for (;;) { 19529119bafbSConrad Meyer uint16_t r = pcg_setseq_32_rxs_m_16_random_r(rng); 19539119bafbSConrad Meyer if (r >= threshold) 19549119bafbSConrad Meyer return r % bound; 19559119bafbSConrad Meyer } 19569119bafbSConrad Meyer } 19579119bafbSConrad Meyer 19589119bafbSConrad Meyer inline uint32_t pcg_setseq_64_rxs_m_32_random_r(struct pcg_state_setseq_64* rng) 19599119bafbSConrad Meyer { 19609119bafbSConrad Meyer uint64_t oldstate = rng->state; 19619119bafbSConrad Meyer pcg_setseq_64_step_r(rng); 19629119bafbSConrad Meyer return pcg_output_rxs_m_64_32(oldstate); 19639119bafbSConrad Meyer } 19649119bafbSConrad Meyer 19659119bafbSConrad Meyer inline uint32_t 19669119bafbSConrad Meyer pcg_setseq_64_rxs_m_32_boundedrand_r(struct pcg_state_setseq_64* rng, 19679119bafbSConrad Meyer uint32_t bound) 19689119bafbSConrad Meyer { 19699119bafbSConrad Meyer uint32_t threshold = -bound % bound; 19709119bafbSConrad Meyer for (;;) { 19719119bafbSConrad Meyer uint32_t r = pcg_setseq_64_rxs_m_32_random_r(rng); 19729119bafbSConrad Meyer if (r >= threshold) 19739119bafbSConrad Meyer return r % bound; 19749119bafbSConrad Meyer } 19759119bafbSConrad Meyer } 19769119bafbSConrad Meyer 19779119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 19789119bafbSConrad Meyer inline uint64_t 19799119bafbSConrad Meyer pcg_setseq_128_rxs_m_64_random_r(struct pcg_state_setseq_128* rng) 19809119bafbSConrad Meyer { 19819119bafbSConrad Meyer pcg_setseq_128_step_r(rng); 19829119bafbSConrad Meyer return pcg_output_rxs_m_128_64(rng->state); 19839119bafbSConrad Meyer } 19849119bafbSConrad Meyer #endif 19859119bafbSConrad Meyer 19869119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 19879119bafbSConrad Meyer inline uint64_t 19889119bafbSConrad Meyer pcg_setseq_128_rxs_m_64_boundedrand_r(struct pcg_state_setseq_128* rng, 19899119bafbSConrad Meyer uint64_t bound) 19909119bafbSConrad Meyer { 19919119bafbSConrad Meyer uint64_t threshold = -bound % bound; 19929119bafbSConrad Meyer for (;;) { 19939119bafbSConrad Meyer uint64_t r = pcg_setseq_128_rxs_m_64_random_r(rng); 19949119bafbSConrad Meyer if (r >= threshold) 19959119bafbSConrad Meyer return r % bound; 19969119bafbSConrad Meyer } 19979119bafbSConrad Meyer } 19989119bafbSConrad Meyer #endif 19999119bafbSConrad Meyer 20009119bafbSConrad Meyer inline uint8_t pcg_mcg_16_rxs_m_8_random_r(struct pcg_state_16* rng) 20019119bafbSConrad Meyer { 20029119bafbSConrad Meyer uint16_t oldstate = rng->state; 20039119bafbSConrad Meyer pcg_mcg_16_step_r(rng); 20049119bafbSConrad Meyer return pcg_output_rxs_m_16_8(oldstate); 20059119bafbSConrad Meyer } 20069119bafbSConrad Meyer 20079119bafbSConrad Meyer inline uint8_t pcg_mcg_16_rxs_m_8_boundedrand_r(struct pcg_state_16* rng, 20089119bafbSConrad Meyer uint8_t bound) 20099119bafbSConrad Meyer { 20109119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound; 20119119bafbSConrad Meyer for (;;) { 20129119bafbSConrad Meyer uint8_t r = pcg_mcg_16_rxs_m_8_random_r(rng); 20139119bafbSConrad Meyer if (r >= threshold) 20149119bafbSConrad Meyer return r % bound; 20159119bafbSConrad Meyer } 20169119bafbSConrad Meyer } 20179119bafbSConrad Meyer 20189119bafbSConrad Meyer inline uint16_t pcg_mcg_32_rxs_m_16_random_r(struct pcg_state_32* rng) 20199119bafbSConrad Meyer { 20209119bafbSConrad Meyer uint32_t oldstate = rng->state; 20219119bafbSConrad Meyer pcg_mcg_32_step_r(rng); 20229119bafbSConrad Meyer return pcg_output_rxs_m_32_16(oldstate); 20239119bafbSConrad Meyer } 20249119bafbSConrad Meyer 20259119bafbSConrad Meyer inline uint16_t pcg_mcg_32_rxs_m_16_boundedrand_r(struct pcg_state_32* rng, 20269119bafbSConrad Meyer uint16_t bound) 20279119bafbSConrad Meyer { 20289119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound; 20299119bafbSConrad Meyer for (;;) { 20309119bafbSConrad Meyer uint16_t r = pcg_mcg_32_rxs_m_16_random_r(rng); 20319119bafbSConrad Meyer if (r >= threshold) 20329119bafbSConrad Meyer return r % bound; 20339119bafbSConrad Meyer } 20349119bafbSConrad Meyer } 20359119bafbSConrad Meyer 20369119bafbSConrad Meyer inline uint32_t pcg_mcg_64_rxs_m_32_random_r(struct pcg_state_64* rng) 20379119bafbSConrad Meyer { 20389119bafbSConrad Meyer uint64_t oldstate = rng->state; 20399119bafbSConrad Meyer pcg_mcg_64_step_r(rng); 20409119bafbSConrad Meyer return pcg_output_rxs_m_64_32(oldstate); 20419119bafbSConrad Meyer } 20429119bafbSConrad Meyer 20439119bafbSConrad Meyer inline uint32_t pcg_mcg_64_rxs_m_32_boundedrand_r(struct pcg_state_64* rng, 20449119bafbSConrad Meyer uint32_t bound) 20459119bafbSConrad Meyer { 20469119bafbSConrad Meyer uint32_t threshold = -bound % bound; 20479119bafbSConrad Meyer for (;;) { 20489119bafbSConrad Meyer uint32_t r = pcg_mcg_64_rxs_m_32_random_r(rng); 20499119bafbSConrad Meyer if (r >= threshold) 20509119bafbSConrad Meyer return r % bound; 20519119bafbSConrad Meyer } 20529119bafbSConrad Meyer } 20539119bafbSConrad Meyer 20549119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 20559119bafbSConrad Meyer inline uint64_t pcg_mcg_128_rxs_m_64_random_r(struct pcg_state_128* rng) 20569119bafbSConrad Meyer { 20579119bafbSConrad Meyer pcg_mcg_128_step_r(rng); 20589119bafbSConrad Meyer return pcg_output_rxs_m_128_64(rng->state); 20599119bafbSConrad Meyer } 20609119bafbSConrad Meyer #endif 20619119bafbSConrad Meyer 20629119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 20639119bafbSConrad Meyer inline uint64_t pcg_mcg_128_rxs_m_64_boundedrand_r(struct pcg_state_128* rng, 20649119bafbSConrad Meyer uint64_t bound) 20659119bafbSConrad Meyer { 20669119bafbSConrad Meyer uint64_t threshold = -bound % bound; 20679119bafbSConrad Meyer for (;;) { 20689119bafbSConrad Meyer uint64_t r = pcg_mcg_128_rxs_m_64_random_r(rng); 20699119bafbSConrad Meyer if (r >= threshold) 20709119bafbSConrad Meyer return r % bound; 20719119bafbSConrad Meyer } 20729119bafbSConrad Meyer } 20739119bafbSConrad Meyer #endif 20749119bafbSConrad Meyer 20759119bafbSConrad Meyer /* Generation functions for XSL RR (only defined for "large" types) */ 20769119bafbSConrad Meyer 20779119bafbSConrad Meyer inline uint32_t pcg_oneseq_64_xsl_rr_32_random_r(struct pcg_state_64* rng) 20789119bafbSConrad Meyer { 20799119bafbSConrad Meyer uint64_t oldstate = rng->state; 20809119bafbSConrad Meyer pcg_oneseq_64_step_r(rng); 20819119bafbSConrad Meyer return pcg_output_xsl_rr_64_32(oldstate); 20829119bafbSConrad Meyer } 20839119bafbSConrad Meyer 20849119bafbSConrad Meyer inline uint32_t pcg_oneseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_64* rng, 20859119bafbSConrad Meyer uint32_t bound) 20869119bafbSConrad Meyer { 20879119bafbSConrad Meyer uint32_t threshold = -bound % bound; 20889119bafbSConrad Meyer for (;;) { 20899119bafbSConrad Meyer uint32_t r = pcg_oneseq_64_xsl_rr_32_random_r(rng); 20909119bafbSConrad Meyer if (r >= threshold) 20919119bafbSConrad Meyer return r % bound; 20929119bafbSConrad Meyer } 20939119bafbSConrad Meyer } 20949119bafbSConrad Meyer 20959119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 20969119bafbSConrad Meyer inline uint64_t pcg_oneseq_128_xsl_rr_64_random_r(struct pcg_state_128* rng) 20979119bafbSConrad Meyer { 20989119bafbSConrad Meyer pcg_oneseq_128_step_r(rng); 20999119bafbSConrad Meyer return pcg_output_xsl_rr_128_64(rng->state); 21009119bafbSConrad Meyer } 21019119bafbSConrad Meyer #endif 21029119bafbSConrad Meyer 21039119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 21049119bafbSConrad Meyer inline uint64_t 21059119bafbSConrad Meyer pcg_oneseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_128* rng, 21069119bafbSConrad Meyer uint64_t bound) 21079119bafbSConrad Meyer { 21089119bafbSConrad Meyer uint64_t threshold = -bound % bound; 21099119bafbSConrad Meyer for (;;) { 21109119bafbSConrad Meyer uint64_t r = pcg_oneseq_128_xsl_rr_64_random_r(rng); 21119119bafbSConrad Meyer if (r >= threshold) 21129119bafbSConrad Meyer return r % bound; 21139119bafbSConrad Meyer } 21149119bafbSConrad Meyer } 21159119bafbSConrad Meyer #endif 21169119bafbSConrad Meyer 21179119bafbSConrad Meyer inline uint32_t pcg_unique_64_xsl_rr_32_random_r(struct pcg_state_64* rng) 21189119bafbSConrad Meyer { 21199119bafbSConrad Meyer uint64_t oldstate = rng->state; 21209119bafbSConrad Meyer pcg_unique_64_step_r(rng); 21219119bafbSConrad Meyer return pcg_output_xsl_rr_64_32(oldstate); 21229119bafbSConrad Meyer } 21239119bafbSConrad Meyer 21249119bafbSConrad Meyer inline uint32_t pcg_unique_64_xsl_rr_32_boundedrand_r(struct pcg_state_64* rng, 21259119bafbSConrad Meyer uint32_t bound) 21269119bafbSConrad Meyer { 21279119bafbSConrad Meyer uint32_t threshold = -bound % bound; 21289119bafbSConrad Meyer for (;;) { 21299119bafbSConrad Meyer uint32_t r = pcg_unique_64_xsl_rr_32_random_r(rng); 21309119bafbSConrad Meyer if (r >= threshold) 21319119bafbSConrad Meyer return r % bound; 21329119bafbSConrad Meyer } 21339119bafbSConrad Meyer } 21349119bafbSConrad Meyer 21359119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 21369119bafbSConrad Meyer inline uint64_t pcg_unique_128_xsl_rr_64_random_r(struct pcg_state_128* rng) 21379119bafbSConrad Meyer { 21389119bafbSConrad Meyer pcg_unique_128_step_r(rng); 21399119bafbSConrad Meyer return pcg_output_xsl_rr_128_64(rng->state); 21409119bafbSConrad Meyer } 21419119bafbSConrad Meyer #endif 21429119bafbSConrad Meyer 21439119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 21449119bafbSConrad Meyer inline uint64_t 21459119bafbSConrad Meyer pcg_unique_128_xsl_rr_64_boundedrand_r(struct pcg_state_128* rng, 21469119bafbSConrad Meyer uint64_t bound) 21479119bafbSConrad Meyer { 21489119bafbSConrad Meyer uint64_t threshold = -bound % bound; 21499119bafbSConrad Meyer for (;;) { 21509119bafbSConrad Meyer uint64_t r = pcg_unique_128_xsl_rr_64_random_r(rng); 21519119bafbSConrad Meyer if (r >= threshold) 21529119bafbSConrad Meyer return r % bound; 21539119bafbSConrad Meyer } 21549119bafbSConrad Meyer } 21559119bafbSConrad Meyer #endif 21569119bafbSConrad Meyer 21579119bafbSConrad Meyer inline uint32_t 21589119bafbSConrad Meyer pcg_setseq_64_xsl_rr_32_random_r(struct pcg_state_setseq_64* rng) 21599119bafbSConrad Meyer { 21609119bafbSConrad Meyer uint64_t oldstate = rng->state; 21619119bafbSConrad Meyer pcg_setseq_64_step_r(rng); 21629119bafbSConrad Meyer return pcg_output_xsl_rr_64_32(oldstate); 21639119bafbSConrad Meyer } 21649119bafbSConrad Meyer 21659119bafbSConrad Meyer inline uint32_t 21669119bafbSConrad Meyer pcg_setseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_setseq_64* rng, 21679119bafbSConrad Meyer uint32_t bound) 21689119bafbSConrad Meyer { 21699119bafbSConrad Meyer uint32_t threshold = -bound % bound; 21709119bafbSConrad Meyer for (;;) { 21719119bafbSConrad Meyer uint32_t r = pcg_setseq_64_xsl_rr_32_random_r(rng); 21729119bafbSConrad Meyer if (r >= threshold) 21739119bafbSConrad Meyer return r % bound; 21749119bafbSConrad Meyer } 21759119bafbSConrad Meyer } 21769119bafbSConrad Meyer 21779119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 21789119bafbSConrad Meyer inline uint64_t 21799119bafbSConrad Meyer pcg_setseq_128_xsl_rr_64_random_r(struct pcg_state_setseq_128* rng) 21809119bafbSConrad Meyer { 21819119bafbSConrad Meyer pcg_setseq_128_step_r(rng); 21829119bafbSConrad Meyer return pcg_output_xsl_rr_128_64(rng->state); 21839119bafbSConrad Meyer } 21849119bafbSConrad Meyer #endif 21859119bafbSConrad Meyer 21869119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 21879119bafbSConrad Meyer inline uint64_t 21889119bafbSConrad Meyer pcg_setseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_setseq_128* rng, 21899119bafbSConrad Meyer uint64_t bound) 21909119bafbSConrad Meyer { 21919119bafbSConrad Meyer uint64_t threshold = -bound % bound; 21929119bafbSConrad Meyer for (;;) { 21939119bafbSConrad Meyer uint64_t r = pcg_setseq_128_xsl_rr_64_random_r(rng); 21949119bafbSConrad Meyer if (r >= threshold) 21959119bafbSConrad Meyer return r % bound; 21969119bafbSConrad Meyer } 21979119bafbSConrad Meyer } 21989119bafbSConrad Meyer #endif 21999119bafbSConrad Meyer 22009119bafbSConrad Meyer inline uint32_t pcg_mcg_64_xsl_rr_32_random_r(struct pcg_state_64* rng) 22019119bafbSConrad Meyer { 22029119bafbSConrad Meyer uint64_t oldstate = rng->state; 22039119bafbSConrad Meyer pcg_mcg_64_step_r(rng); 22049119bafbSConrad Meyer return pcg_output_xsl_rr_64_32(oldstate); 22059119bafbSConrad Meyer } 22069119bafbSConrad Meyer 22079119bafbSConrad Meyer inline uint32_t pcg_mcg_64_xsl_rr_32_boundedrand_r(struct pcg_state_64* rng, 22089119bafbSConrad Meyer uint32_t bound) 22099119bafbSConrad Meyer { 22109119bafbSConrad Meyer uint32_t threshold = -bound % bound; 22119119bafbSConrad Meyer for (;;) { 22129119bafbSConrad Meyer uint32_t r = pcg_mcg_64_xsl_rr_32_random_r(rng); 22139119bafbSConrad Meyer if (r >= threshold) 22149119bafbSConrad Meyer return r % bound; 22159119bafbSConrad Meyer } 22169119bafbSConrad Meyer } 22179119bafbSConrad Meyer 22189119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 22199119bafbSConrad Meyer inline uint64_t pcg_mcg_128_xsl_rr_64_random_r(struct pcg_state_128* rng) 22209119bafbSConrad Meyer { 22219119bafbSConrad Meyer pcg_mcg_128_step_r(rng); 22229119bafbSConrad Meyer return pcg_output_xsl_rr_128_64(rng->state); 22239119bafbSConrad Meyer } 22249119bafbSConrad Meyer #endif 22259119bafbSConrad Meyer 22269119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 22279119bafbSConrad Meyer inline uint64_t pcg_mcg_128_xsl_rr_64_boundedrand_r(struct pcg_state_128* rng, 22289119bafbSConrad Meyer uint64_t bound) 22299119bafbSConrad Meyer { 22309119bafbSConrad Meyer uint64_t threshold = -bound % bound; 22319119bafbSConrad Meyer for (;;) { 22329119bafbSConrad Meyer uint64_t r = pcg_mcg_128_xsl_rr_64_random_r(rng); 22339119bafbSConrad Meyer if (r >= threshold) 22349119bafbSConrad Meyer return r % bound; 22359119bafbSConrad Meyer } 22369119bafbSConrad Meyer } 22379119bafbSConrad Meyer #endif 22389119bafbSConrad Meyer 22399119bafbSConrad Meyer /* Generation functions for XSL RR RR (only defined for "large" types) */ 22409119bafbSConrad Meyer 22419119bafbSConrad Meyer inline uint64_t pcg_oneseq_64_xsl_rr_rr_64_random_r(struct pcg_state_64* rng) 22429119bafbSConrad Meyer { 22439119bafbSConrad Meyer uint64_t oldstate = rng->state; 22449119bafbSConrad Meyer pcg_oneseq_64_step_r(rng); 22459119bafbSConrad Meyer return pcg_output_xsl_rr_rr_64_64(oldstate); 22469119bafbSConrad Meyer } 22479119bafbSConrad Meyer 22489119bafbSConrad Meyer inline uint64_t 22499119bafbSConrad Meyer pcg_oneseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64* rng, 22509119bafbSConrad Meyer uint64_t bound) 22519119bafbSConrad Meyer { 22529119bafbSConrad Meyer uint64_t threshold = -bound % bound; 22539119bafbSConrad Meyer for (;;) { 22549119bafbSConrad Meyer uint64_t r = pcg_oneseq_64_xsl_rr_rr_64_random_r(rng); 22559119bafbSConrad Meyer if (r >= threshold) 22569119bafbSConrad Meyer return r % bound; 22579119bafbSConrad Meyer } 22589119bafbSConrad Meyer } 22599119bafbSConrad Meyer 22609119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 22619119bafbSConrad Meyer inline pcg128_t pcg_oneseq_128_xsl_rr_rr_128_random_r(struct pcg_state_128* rng) 22629119bafbSConrad Meyer { 22639119bafbSConrad Meyer pcg_oneseq_128_step_r(rng); 22649119bafbSConrad Meyer return pcg_output_xsl_rr_rr_128_128(rng->state); 22659119bafbSConrad Meyer } 22669119bafbSConrad Meyer #endif 22679119bafbSConrad Meyer 22689119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 22699119bafbSConrad Meyer inline pcg128_t 22709119bafbSConrad Meyer pcg_oneseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128* rng, 22719119bafbSConrad Meyer pcg128_t bound) 22729119bafbSConrad Meyer { 22739119bafbSConrad Meyer pcg128_t threshold = -bound % bound; 22749119bafbSConrad Meyer for (;;) { 22759119bafbSConrad Meyer pcg128_t r = pcg_oneseq_128_xsl_rr_rr_128_random_r(rng); 22769119bafbSConrad Meyer if (r >= threshold) 22779119bafbSConrad Meyer return r % bound; 22789119bafbSConrad Meyer } 22799119bafbSConrad Meyer } 22809119bafbSConrad Meyer #endif 22819119bafbSConrad Meyer 22829119bafbSConrad Meyer inline uint64_t pcg_unique_64_xsl_rr_rr_64_random_r(struct pcg_state_64* rng) 22839119bafbSConrad Meyer { 22849119bafbSConrad Meyer uint64_t oldstate = rng->state; 22859119bafbSConrad Meyer pcg_unique_64_step_r(rng); 22869119bafbSConrad Meyer return pcg_output_xsl_rr_rr_64_64(oldstate); 22879119bafbSConrad Meyer } 22889119bafbSConrad Meyer 22899119bafbSConrad Meyer inline uint64_t 22909119bafbSConrad Meyer pcg_unique_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64* rng, 22919119bafbSConrad Meyer uint64_t bound) 22929119bafbSConrad Meyer { 22939119bafbSConrad Meyer uint64_t threshold = -bound % bound; 22949119bafbSConrad Meyer for (;;) { 22959119bafbSConrad Meyer uint64_t r = pcg_unique_64_xsl_rr_rr_64_random_r(rng); 22969119bafbSConrad Meyer if (r >= threshold) 22979119bafbSConrad Meyer return r % bound; 22989119bafbSConrad Meyer } 22999119bafbSConrad Meyer } 23009119bafbSConrad Meyer 23019119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 23029119bafbSConrad Meyer inline pcg128_t pcg_unique_128_xsl_rr_rr_128_random_r(struct pcg_state_128* rng) 23039119bafbSConrad Meyer { 23049119bafbSConrad Meyer pcg_unique_128_step_r(rng); 23059119bafbSConrad Meyer return pcg_output_xsl_rr_rr_128_128(rng->state); 23069119bafbSConrad Meyer } 23079119bafbSConrad Meyer #endif 23089119bafbSConrad Meyer 23099119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 23109119bafbSConrad Meyer inline pcg128_t 23119119bafbSConrad Meyer pcg_unique_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128* rng, 23129119bafbSConrad Meyer pcg128_t bound) 23139119bafbSConrad Meyer { 23149119bafbSConrad Meyer pcg128_t threshold = -bound % bound; 23159119bafbSConrad Meyer for (;;) { 23169119bafbSConrad Meyer pcg128_t r = pcg_unique_128_xsl_rr_rr_128_random_r(rng); 23179119bafbSConrad Meyer if (r >= threshold) 23189119bafbSConrad Meyer return r % bound; 23199119bafbSConrad Meyer } 23209119bafbSConrad Meyer } 23219119bafbSConrad Meyer #endif 23229119bafbSConrad Meyer 23239119bafbSConrad Meyer inline uint64_t 23249119bafbSConrad Meyer pcg_setseq_64_xsl_rr_rr_64_random_r(struct pcg_state_setseq_64* rng) 23259119bafbSConrad Meyer { 23269119bafbSConrad Meyer uint64_t oldstate = rng->state; 23279119bafbSConrad Meyer pcg_setseq_64_step_r(rng); 23289119bafbSConrad Meyer return pcg_output_xsl_rr_rr_64_64(oldstate); 23299119bafbSConrad Meyer } 23309119bafbSConrad Meyer 23319119bafbSConrad Meyer inline uint64_t 23329119bafbSConrad Meyer pcg_setseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_setseq_64* rng, 23339119bafbSConrad Meyer uint64_t bound) 23349119bafbSConrad Meyer { 23359119bafbSConrad Meyer uint64_t threshold = -bound % bound; 23369119bafbSConrad Meyer for (;;) { 23379119bafbSConrad Meyer uint64_t r = pcg_setseq_64_xsl_rr_rr_64_random_r(rng); 23389119bafbSConrad Meyer if (r >= threshold) 23399119bafbSConrad Meyer return r % bound; 23409119bafbSConrad Meyer } 23419119bafbSConrad Meyer } 23429119bafbSConrad Meyer 23439119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 23449119bafbSConrad Meyer inline pcg128_t 23459119bafbSConrad Meyer pcg_setseq_128_xsl_rr_rr_128_random_r(struct pcg_state_setseq_128* rng) 23469119bafbSConrad Meyer { 23479119bafbSConrad Meyer pcg_setseq_128_step_r(rng); 23489119bafbSConrad Meyer return pcg_output_xsl_rr_rr_128_128(rng->state); 23499119bafbSConrad Meyer } 23509119bafbSConrad Meyer #endif 23519119bafbSConrad Meyer 23529119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 23539119bafbSConrad Meyer inline pcg128_t 23549119bafbSConrad Meyer pcg_setseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_setseq_128* rng, 23559119bafbSConrad Meyer pcg128_t bound) 23569119bafbSConrad Meyer { 23579119bafbSConrad Meyer pcg128_t threshold = -bound % bound; 23589119bafbSConrad Meyer for (;;) { 23599119bafbSConrad Meyer pcg128_t r = pcg_setseq_128_xsl_rr_rr_128_random_r(rng); 23609119bafbSConrad Meyer if (r >= threshold) 23619119bafbSConrad Meyer return r % bound; 23629119bafbSConrad Meyer } 23639119bafbSConrad Meyer } 23649119bafbSConrad Meyer #endif 23659119bafbSConrad Meyer 23669119bafbSConrad Meyer /*** Typedefs */ 23679119bafbSConrad Meyer typedef struct pcg_state_setseq_64 pcg32_random_t; 23689119bafbSConrad Meyer typedef struct pcg_state_64 pcg32s_random_t; 23699119bafbSConrad Meyer typedef struct pcg_state_64 pcg32u_random_t; 23709119bafbSConrad Meyer typedef struct pcg_state_64 pcg32f_random_t; 23719119bafbSConrad Meyer /*** random_r */ 23729119bafbSConrad Meyer #define pcg32_random_r pcg_setseq_64_xsh_rr_32_random_r 23739119bafbSConrad Meyer #define pcg32s_random_r pcg_oneseq_64_xsh_rr_32_random_r 23749119bafbSConrad Meyer #define pcg32u_random_r pcg_unique_64_xsh_rr_32_random_r 23759119bafbSConrad Meyer #define pcg32f_random_r pcg_mcg_64_xsh_rs_32_random_r 23769119bafbSConrad Meyer /*** boundedrand_r */ 23779119bafbSConrad Meyer #define pcg32_boundedrand_r pcg_setseq_64_xsh_rr_32_boundedrand_r 23789119bafbSConrad Meyer #define pcg32s_boundedrand_r pcg_oneseq_64_xsh_rr_32_boundedrand_r 23799119bafbSConrad Meyer #define pcg32u_boundedrand_r pcg_unique_64_xsh_rr_32_boundedrand_r 23809119bafbSConrad Meyer #define pcg32f_boundedrand_r pcg_mcg_64_xsh_rs_32_boundedrand_r 23819119bafbSConrad Meyer /*** srandom_r */ 23829119bafbSConrad Meyer #define pcg32_srandom_r pcg_setseq_64_srandom_r 23839119bafbSConrad Meyer #define pcg32s_srandom_r pcg_oneseq_64_srandom_r 23849119bafbSConrad Meyer #define pcg32u_srandom_r pcg_unique_64_srandom_r 23859119bafbSConrad Meyer #define pcg32f_srandom_r pcg_mcg_64_srandom_r 23869119bafbSConrad Meyer /*** advance_r */ 23879119bafbSConrad Meyer #define pcg32_advance_r pcg_setseq_64_advance_r 23889119bafbSConrad Meyer #define pcg32s_advance_r pcg_oneseq_64_advance_r 23899119bafbSConrad Meyer #define pcg32u_advance_r pcg_unique_64_advance_r 23909119bafbSConrad Meyer #define pcg32f_advance_r pcg_mcg_64_advance_r 23919119bafbSConrad Meyer 23929119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 23939119bafbSConrad Meyer /*** Typedefs */ 23949119bafbSConrad Meyer typedef struct pcg_state_setseq_128 pcg64_random_t; 23959119bafbSConrad Meyer typedef struct pcg_state_128 pcg64s_random_t; 23969119bafbSConrad Meyer typedef struct pcg_state_128 pcg64u_random_t; 23979119bafbSConrad Meyer typedef struct pcg_state_128 pcg64f_random_t; 23989119bafbSConrad Meyer /*** random_r */ 23999119bafbSConrad Meyer #define pcg64_random_r pcg_setseq_128_xsl_rr_64_random_r 24009119bafbSConrad Meyer #define pcg64s_random_r pcg_oneseq_128_xsl_rr_64_random_r 24019119bafbSConrad Meyer #define pcg64u_random_r pcg_unique_128_xsl_rr_64_random_r 24029119bafbSConrad Meyer #define pcg64f_random_r pcg_mcg_128_xsl_rr_64_random_r 24039119bafbSConrad Meyer /*** boundedrand_r */ 24049119bafbSConrad Meyer #define pcg64_boundedrand_r pcg_setseq_128_xsl_rr_64_boundedrand_r 24059119bafbSConrad Meyer #define pcg64s_boundedrand_r pcg_oneseq_128_xsl_rr_64_boundedrand_r 24069119bafbSConrad Meyer #define pcg64u_boundedrand_r pcg_unique_128_xsl_rr_64_boundedrand_r 24079119bafbSConrad Meyer #define pcg64f_boundedrand_r pcg_mcg_128_xsl_rr_64_boundedrand_r 24089119bafbSConrad Meyer /*** srandom_r */ 24099119bafbSConrad Meyer #define pcg64_srandom_r pcg_setseq_128_srandom_r 24109119bafbSConrad Meyer #define pcg64s_srandom_r pcg_oneseq_128_srandom_r 24119119bafbSConrad Meyer #define pcg64u_srandom_r pcg_unique_128_srandom_r 24129119bafbSConrad Meyer #define pcg64f_srandom_r pcg_mcg_128_srandom_r 24139119bafbSConrad Meyer /*** advance_r */ 24149119bafbSConrad Meyer #define pcg64_advance_r pcg_setseq_128_advance_r 24159119bafbSConrad Meyer #define pcg64s_advance_r pcg_oneseq_128_advance_r 24169119bafbSConrad Meyer #define pcg64u_advance_r pcg_unique_128_advance_r 24179119bafbSConrad Meyer #define pcg64f_advance_r pcg_mcg_128_advance_r 24189119bafbSConrad Meyer #endif 24199119bafbSConrad Meyer 24209119bafbSConrad Meyer /*** Typedefs */ 24219119bafbSConrad Meyer typedef struct pcg_state_8 pcg8si_random_t; 24229119bafbSConrad Meyer typedef struct pcg_state_16 pcg16si_random_t; 24239119bafbSConrad Meyer typedef struct pcg_state_32 pcg32si_random_t; 24249119bafbSConrad Meyer typedef struct pcg_state_64 pcg64si_random_t; 24259119bafbSConrad Meyer /*** random_r */ 24269119bafbSConrad Meyer #define pcg8si_random_r pcg_oneseq_8_rxs_m_xs_8_random_r 24279119bafbSConrad Meyer #define pcg16si_random_r pcg_oneseq_16_rxs_m_xs_16_random_r 24289119bafbSConrad Meyer #define pcg32si_random_r pcg_oneseq_32_rxs_m_xs_32_random_r 24299119bafbSConrad Meyer #define pcg64si_random_r pcg_oneseq_64_rxs_m_xs_64_random_r 24309119bafbSConrad Meyer /*** boundedrand_r */ 24319119bafbSConrad Meyer #define pcg8si_boundedrand_r pcg_oneseq_8_rxs_m_xs_8_boundedrand_r 24329119bafbSConrad Meyer #define pcg16si_boundedrand_r pcg_oneseq_16_rxs_m_xs_16_boundedrand_r 24339119bafbSConrad Meyer #define pcg32si_boundedrand_r pcg_oneseq_32_rxs_m_xs_32_boundedrand_r 24349119bafbSConrad Meyer #define pcg64si_boundedrand_r pcg_oneseq_64_rxs_m_xs_64_boundedrand_r 24359119bafbSConrad Meyer /*** srandom_r */ 24369119bafbSConrad Meyer #define pcg8si_srandom_r pcg_oneseq_8_srandom_r 24379119bafbSConrad Meyer #define pcg16si_srandom_r pcg_oneseq_16_srandom_r 24389119bafbSConrad Meyer #define pcg32si_srandom_r pcg_oneseq_32_srandom_r 24399119bafbSConrad Meyer #define pcg64si_srandom_r pcg_oneseq_64_srandom_r 24409119bafbSConrad Meyer /*** advance_r */ 24419119bafbSConrad Meyer #define pcg8si_advance_r pcg_oneseq_8_advance_r 24429119bafbSConrad Meyer #define pcg16si_advance_r pcg_oneseq_16_advance_r 24439119bafbSConrad Meyer #define pcg32si_advance_r pcg_oneseq_32_advance_r 24449119bafbSConrad Meyer #define pcg64si_advance_r pcg_oneseq_64_advance_r 24459119bafbSConrad Meyer 24469119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 24479119bafbSConrad Meyer typedef struct pcg_state_128 pcg128si_random_t; 24489119bafbSConrad Meyer #define pcg128si_random_r pcg_oneseq_128_rxs_m_xs_128_random_r 24499119bafbSConrad Meyer #define pcg128si_boundedrand_r pcg_oneseq_128_rxs_m_xs_128_boundedrand_r 24509119bafbSConrad Meyer #define pcg128si_srandom_r pcg_oneseq_128_srandom_r 24519119bafbSConrad Meyer #define pcg128si_advance_r pcg_oneseq_128_advance_r 24529119bafbSConrad Meyer #endif 24539119bafbSConrad Meyer 24549119bafbSConrad Meyer /*** Typedefs */ 24559119bafbSConrad Meyer typedef struct pcg_state_setseq_8 pcg8i_random_t; 24569119bafbSConrad Meyer typedef struct pcg_state_setseq_16 pcg16i_random_t; 24579119bafbSConrad Meyer typedef struct pcg_state_setseq_32 pcg32i_random_t; 24589119bafbSConrad Meyer typedef struct pcg_state_setseq_64 pcg64i_random_t; 24599119bafbSConrad Meyer /*** random_r */ 24609119bafbSConrad Meyer #define pcg8i_random_r pcg_setseq_8_rxs_m_xs_8_random_r 24619119bafbSConrad Meyer #define pcg16i_random_r pcg_setseq_16_rxs_m_xs_16_random_r 24629119bafbSConrad Meyer #define pcg32i_random_r pcg_setseq_32_rxs_m_xs_32_random_r 24639119bafbSConrad Meyer #define pcg64i_random_r pcg_setseq_64_rxs_m_xs_64_random_r 24649119bafbSConrad Meyer /*** boundedrand_r */ 24659119bafbSConrad Meyer #define pcg8i_boundedrand_r pcg_setseq_8_rxs_m_xs_8_boundedrand_r 24669119bafbSConrad Meyer #define pcg16i_boundedrand_r pcg_setseq_16_rxs_m_xs_16_boundedrand_r 24679119bafbSConrad Meyer #define pcg32i_boundedrand_r pcg_setseq_32_rxs_m_xs_32_boundedrand_r 24689119bafbSConrad Meyer #define pcg64i_boundedrand_r pcg_setseq_64_rxs_m_xs_64_boundedrand_r 24699119bafbSConrad Meyer /*** srandom_r */ 24709119bafbSConrad Meyer #define pcg8i_srandom_r pcg_setseq_8_srandom_r 24719119bafbSConrad Meyer #define pcg16i_srandom_r pcg_setseq_16_srandom_r 24729119bafbSConrad Meyer #define pcg32i_srandom_r pcg_setseq_32_srandom_r 24739119bafbSConrad Meyer #define pcg64i_srandom_r pcg_setseq_64_srandom_r 24749119bafbSConrad Meyer /*** advance_r */ 24759119bafbSConrad Meyer #define pcg8i_advance_r pcg_setseq_8_advance_r 24769119bafbSConrad Meyer #define pcg16i_advance_r pcg_setseq_16_advance_r 24779119bafbSConrad Meyer #define pcg32i_advance_r pcg_setseq_32_advance_r 24789119bafbSConrad Meyer #define pcg64i_advance_r pcg_setseq_64_advance_r 24799119bafbSConrad Meyer 24809119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 24819119bafbSConrad Meyer typedef struct pcg_state_setseq_128 pcg128i_random_t; 24829119bafbSConrad Meyer #define pcg128i_random_r pcg_setseq_128_rxs_m_xs_128_random_r 24839119bafbSConrad Meyer #define pcg128i_boundedrand_r pcg_setseq_128_rxs_m_xs_128_boundedrand_r 24849119bafbSConrad Meyer #define pcg128i_srandom_r pcg_setseq_128_srandom_r 24859119bafbSConrad Meyer #define pcg128i_advance_r pcg_setseq_128_advance_r 24869119bafbSConrad Meyer #endif 24879119bafbSConrad Meyer 24889119bafbSConrad Meyer /* 24899119bafbSConrad Meyer * Static initialization constants (if you can't call srandom for some 24909119bafbSConrad Meyer * bizarre reason). 24919119bafbSConrad Meyer */ 24929119bafbSConrad Meyer 24939119bafbSConrad Meyer #define PCG32_INITIALIZER PCG_STATE_SETSEQ_64_INITIALIZER 24949119bafbSConrad Meyer #define PCG32U_INITIALIZER PCG_STATE_UNIQUE_64_INITIALIZER 24959119bafbSConrad Meyer #define PCG32S_INITIALIZER PCG_STATE_ONESEQ_64_INITIALIZER 24969119bafbSConrad Meyer #define PCG32F_INITIALIZER PCG_STATE_MCG_64_INITIALIZER 24979119bafbSConrad Meyer 24989119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 24999119bafbSConrad Meyer #define PCG64_INITIALIZER PCG_STATE_SETSEQ_128_INITIALIZER 25009119bafbSConrad Meyer #define PCG64U_INITIALIZER PCG_STATE_UNIQUE_128_INITIALIZER 25019119bafbSConrad Meyer #define PCG64S_INITIALIZER PCG_STATE_ONESEQ_128_INITIALIZER 25029119bafbSConrad Meyer #define PCG64F_INITIALIZER PCG_STATE_MCG_128_INITIALIZER 25039119bafbSConrad Meyer #endif 25049119bafbSConrad Meyer 25059119bafbSConrad Meyer #define PCG8SI_INITIALIZER PCG_STATE_ONESEQ_8_INITIALIZER 25069119bafbSConrad Meyer #define PCG16SI_INITIALIZER PCG_STATE_ONESEQ_16_INITIALIZER 25079119bafbSConrad Meyer #define PCG32SI_INITIALIZER PCG_STATE_ONESEQ_32_INITIALIZER 25089119bafbSConrad Meyer #define PCG64SI_INITIALIZER PCG_STATE_ONESEQ_64_INITIALIZER 25099119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 25109119bafbSConrad Meyer #define PCG128SI_INITIALIZER PCG_STATE_ONESEQ_128_INITIALIZER 25119119bafbSConrad Meyer #endif 25129119bafbSConrad Meyer 25139119bafbSConrad Meyer #define PCG8I_INITIALIZER PCG_STATE_SETSEQ_8_INITIALIZER 25149119bafbSConrad Meyer #define PCG16I_INITIALIZER PCG_STATE_SETSEQ_16_INITIALIZER 25159119bafbSConrad Meyer #define PCG32I_INITIALIZER PCG_STATE_SETSEQ_32_INITIALIZER 25169119bafbSConrad Meyer #define PCG64I_INITIALIZER PCG_STATE_SETSEQ_64_INITIALIZER 25179119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS 25189119bafbSConrad Meyer #define PCG128I_INITIALIZER PCG_STATE_SETSEQ_128_INITIALIZER 25199119bafbSConrad Meyer #endif 25209119bafbSConrad Meyer 2521*8a0edc91SConrad Meyer #ifdef __cplusplus 25229119bafbSConrad Meyer } 25239119bafbSConrad Meyer #endif 25249119bafbSConrad Meyer 25259119bafbSConrad Meyer #endif /* PCG_VARIANTS_H_INCLUDED */ 25269119bafbSConrad Meyer 2527