Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/bits/random.hfa

    r611f29d r7812a7b5  
    33#include <stdint.h>
    44
    5 // Pipelined to allow out-of-order overlap with reduced dependencies. Critically, return the current value, and compute
    6 // and store the next value.
    7 
    85//--------------------------------------------------
    96#if defined(__SIZEOF_INT128__)
    10         static inline uint64_t lehmer64( __uint128_t & state ) {
    11                 __uint128_t ret = state;
     7        typedef __uint128_t __lehmer64_state_t;
     8        static inline uint64_t __lehmer64( __lehmer64_state_t & state ) {
    129                state *= 0xda942042e4dd58b5;
    13                 return ret >> 64;
     10                return state >> 64;
    1411        }
    1512
    1613//--------------------------------------------------
    17         static inline uint64_t wyhash64( uint64_t & state ) {
     14        typedef uint64_t __wyhash64_state_t;
     15        static inline uint64_t __wyhash64( __wyhash64_state_t & state ) {
    1816                state += 0x60bee2bee120fc15;
    1917                __uint128_t tmp;
     
    2725
    2826//--------------------------------------------------
    29 static inline uint64_t xorshift_13_7_17( uint64_t & state ) {
    30         uint64_t ret = state;
    31         state ^= state << 13;
    32         state ^= state >> 7;
    33         state ^= state << 17;
    34         return ret;
     27typedef uint64_t __xorshift64_state_t;
     28static inline uint64_t __xorshift64( __xorshift64_state_t & state ) {
     29        uint64_t x = state;
     30        x ^= x << 13;
     31        x ^= x >> 7;
     32        x ^= x << 17;
     33        return state = x;
    3534}
    36 
    37 //--------------------------------------------------
    38 static inline uint32_t xorshift_6_21_7( uint32_t & state ) {
    39         uint32_t ret = state;
    40         state ^= state << 6;
    41         state ^= state >> 21;
    42         state ^= state << 7;
    43         return ret;
    44 } // xorshift_6_21_7
    4535
    4636//--------------------------------------------------
     
    4838  uint32_t a, b, c, d;
    4939  uint32_t counter;
    50 } xorwow__state_t;
     40} __xorwow__state_t;
    5141
    5242/* The state array must be initialized to not be all zero in the first four words */
    53 static inline uint32_t xorwow( xorwow__state_t & state ) {
     43static inline uint32_t __xorwow( __xorwow__state_t & state ) {
    5444        /* Algorithm "xorwow" from p. 5 of Marsaglia, "Xorshift RNGs" */
    55         uint32_t ret = state.a + state.counter;
    5645        uint32_t t = state.d;
    5746
     
    6756
    6857        state.counter += 362437;
    69         return ret;
     58        return t + state.counter;
    7059}
    71 
    72 //--------------------------------------------------
    73 static inline uint32_t LCG( uint32_t & state ) {                // linear congruential generator
    74         uint32_t ret = state;
    75         state = 36969 * (state & 65535) + (state >> 16);        // 36969 is NOT prime! No not change it!
    76         return ret;
    77 } // LCG
    78 
    79 //--------------------------------------------------
    80 #define M  (1_l64u << 48_l64u)
    81 #define A  (25214903917_l64u)
    82 #define AI (18446708753438544741_l64u)
    83 #define C  (11_l64u)
    84 #define D  (16_l64u)
    85 
    86 static inline uint32_t LCGBI_fwd( uint64_t & state ) {
    87         state = (A * state + C) & (M - 1);
    88         return state >> D;
    89 }
    90 
    91 static inline uint32_t LCGBI_bck( uint64_t & state ) {
    92         unsigned int r = state >> D;
    93         state = AI * (state - C) & (M - 1);
    94         return r;
    95 }
    96 
    97 #undef M
    98 #undef A
    99 #undef AI
    100 #undef C
    101 #undef D
Note: See TracChangeset for help on using the changeset viewer.