X-Git-Url: https://ginac.de/CLN/cln.git//cln.git?a=blobdiff_plain;f=src%2Fbase%2Frandom%2Fcl_random_from.cc;h=22d48b68dc182698240bf06e8fda09a59e320245;hb=8169a19b38c42588b39b21dae5bdb964e2f6b8c6;hp=1b2ad609dc51e30e80b45099cd7eaea516227ba4;hpb=a8369235e23acbacbad414dc1675be8c279e27a2;p=cln.git diff --git a/src/base/random/cl_random_from.cc b/src/base/random/cl_random_from.cc index 1b2ad60..22d48b6 100644 --- a/src/base/random/cl_random_from.cc +++ b/src/base/random/cl_random_from.cc @@ -1,7 +1,12 @@ // random_state constructor. + +#if defined(_WIN32) +#include // For GetCurrentProcessId(), must be included first, sorry. +#endif + // General includes. -#include "cl_sysdep.h" +#include "base/cl_sysdep.h" // Specification. #include "cln/random.h" @@ -9,14 +14,14 @@ // Implementation. -#include "cl_base_config.h" -#include "cl_low.h" +#include "base/cl_base_config.h" +#include "base/cl_low.h" +#include // declares rand() -#if defined(unix) || defined(__unix) || defined(_AIX) || defined(sinix) || (defined(__MACH__) && defined(__APPLE__)) || (defined(_WIN32) && defined(__GNUC__)) || defined(__BEOS__) +#if defined(unix) || defined(__unix) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(_AIX) || defined(sinix) || (defined(__MACH__) && defined(__APPLE__)) || (defined(__CYGWIN__) && defined(__GNUC__)) || defined(__BEOS__) #include #include // declares getpid() -#include // declares rand() #if defined(HAVE_GETTIMEOFDAY) @@ -27,12 +32,14 @@ extern "C" int gettimeofday (struct timeval * tp, GETTIMEOFDAY_TZP_T tzp); #endif +namespace cln { inline uint32 get_seed (void) { var struct timeval tv; gettimeofday(&tv,0); - return cln::highlow32(tv.tv_sec,tv.tv_usec); // 16+16 zufällige Bits + return highlow32(tv.tv_sec,tv.tv_usec); // 16+16 zufällige Bits } +} // namespace cln #elif defined(HAVE_TIMES_CLOCK) @@ -43,15 +50,30 @@ inline uint32 get_seed (void) #include extern "C" clock_t times (struct tms * buffer); +namespace cln { inline uint32 get_seed (void) { var struct tms tmsbuf; var uint32 seed_lo = times(&tmsbuf); return seed_lo + tmsbuf.tms_utime + tmsbuf.tms_stime; } +} // namespace cln #endif +#elif defined(_WIN32) +#include +#include + +namespace cln { +inline uint32 get_seed (void) +{ + struct timeb timebuf; + ftime(&timebuf); + return highlow32(timebuf.time, (long)(timebuf.millitm)*1000); +} +} // namespace cln + #endif namespace cln { @@ -64,18 +86,24 @@ random_state::random_state () { var uint32 seed_hi; var uint32 seed_lo; -#if defined(unix) || defined(__unix) || defined(_AIX) || defined(sinix) || (defined(__MACH__) && defined(__APPLE__)) || (defined(_WIN32) && defined(__GNUC__)) || defined(__BEOS__) - seed_lo = ::get_seed(); - seed_hi = (rand() // zufällige 31 Bit (bei UNIX_BSD) bzw. 16 Bit (bei UNIX_SYSV) +#if defined(unix) || defined(__unix) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(_AIX) || defined(sinix) || (defined(__MACH__) && defined(__APPLE__)) || (defined(__CYGWIN__) && defined(__GNUC__)) || defined(__BEOS__) + seed_lo = get_seed(); + seed_hi = (rand() // zufällige 31 Bit (bei UNIX_BSD) bzw. 16 Bit (bei UNIX_SYSV) << 8) ^ (uintL)(getpid()); // ca. 8 Bit von der Process ID +#elif defined(__OpenBSD__) + seed_lo = arc4random(); + seed_hi = arc4random(); +#elif defined(_WIN32) + seed_lo = get_seed(); + seed_hi = (rand() << 8) ^ (uintL)(GetCurrentProcessId()); #elif defined(__atarist) - seed_lo = highlow32(GEMDOS_GetDate(),GEMDOS_GetTime()); // 16+16 zufällige Bits - seed_hi = XBIOS_Random(); // 24 Bit zufällig vom XBIOS, vorne 8 Nullbits + seed_lo = highlow32(GEMDOS_GetDate(),GEMDOS_GetTime()); // 16+16 zufällige Bits + seed_hi = XBIOS_Random(); // 24 Bit zufällig vom XBIOS, vorne 8 Nullbits #elif defined(amiga) || defined(AMIGA) seed_lo = get_real_time(); // Uhrzeit seed_hi = FindTask(NULL); // Pointer auf eigene Task #elif defined(__MSDOS__) || defined(__EMX__) || defined(__riscos) - // Keine Zufallszahlen, keine PID, nichts Zufälliges da. + // Keine Zufallszahlen, keine PID, nichts Zufälliges da. seed_lo = get_real_time(); // Uhrzeit, 100 Hz seed_hi = time(NULL); #else