/** * random.h: SIMD oriented Fast Mersenne Twister (SFMT) pseudorandom * * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team * Rights to this code are as documented in COPYING. * * * Portions of this file were derived from sources bearing the following license: * Copyright © 2006, 2007 Mutsuo Saito, Makoto Matsumoto and Hiroshima * University. All rights reserved. * The new BSD License is applied to this software. * * @author Mutsuo Saito (Hiroshima University) * @author Makoto Matsumoto (Hiroshima University) * * $Id: random.h,v 1.5 2007/09/22 14:27:26 pippijn dead $ */ #ifndef COMMON_RANDOM_H #define COMMON_RANDOM_H #include #if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) #include #elif defined (_MSC_VER) || defined (__BORLANDC__) typedef unsigned int uint32_t; typedef unsigned __int64 uint64_t; #define inline __inline #else #include #if defined (__GNUC__) #define inline __inline__ #endif #endif #ifndef PRIu64 #if defined (_MSC_VER) || defined (__BORLANDC__) #define PRIu64 "I64u" #define PRIx64 "I64x" #else #define PRIu64 "lu" #define PRIx64 "lx" #endif #endif #if defined (__GNUC__) #define ALWAYSINLINE __attribute__ ((always_inline)) #endif uint32_t gen_rand32 (void); uint64_t gen_rand64 (void); void fill_array32 (uint32_t *array, int size); void fill_array64 (uint64_t *array, int size); void init_gen_rand (uint32_t seed); void init_by_array (uint32_t *init_key, int key_length); char const * const get_idstring (void); int get_min_array_size32 (void); int get_min_array_size64 (void); /* These real versions are due to Isaku Wada */ /** generates a random number on [0,1]-real-interval */ inline double to_real1 (uint32_t v) { return v * (1.0/4294967295.0); /* divided by 2^32-1 */ } /** generates a random number on [0,1]-real-interval */ inline double genrand_real1 (void) { return to_real1 (gen_rand32 ()); } /** generates a random number on [0,1)-real-interval */ inline double to_real2 (uint32_t v) { return v * (1.0/4294967296.0); /* divided by 2^32 */ } /** generates a random number on [0,1)-real-interval */ inline double genrand_real2 (void) { return to_real2 (gen_rand32 ()); } /** generates a random number on (0,1)-real-interval */ inline double to_real3 (uint32_t v) { return ( ((double)v) + 0.5)* (1.0/4294967296.0); /* divided by 2^32 */ } /** generates a random number on (0,1)-real-interval */ inline double genrand_real3 (void) { return to_real3 (gen_rand32 ()); } /** These real versions are due to Isaku Wada */ /** generates a random number on [0,1) with 53-bit resolution*/ inline double to_res53 (uint64_t v) { return v * (1.0/18446744073709551616.0L); } /** generates a random number on [0,1) with 53-bit resolution*/ inline double genrand_res53 (void) { return to_res53 (gen_rand64 ()); } /*------------------------------------------------------ 128-bit SIMD data type for Altivec, SSE2 or standard C ------------------------------------------------------*/ #if defined (HAVE_ALTIVEC) #if !defined (__APPLE__) #include #endif /** 128-bit data structure */ union W128_T { vector unsigned int s; uint32_t u[4]; }; /** 128-bit data type */ typedef union W128_T w128_t; #elif defined (HAVE_SSE2) #include /** 128-bit data structure */ union W128_T { __m128i si; uint32_t u[4]; }; /** 128-bit data type */ typedef union W128_T w128_t; #else /** 128-bit data structure */ struct W128_T { uint32_t u[4]; }; /** 128-bit data type */ typedef struct W128_T w128_t; #endif #endif