#include "Yap.h" #include "Yatom.h" #include "YapHeap.h" #include "yapio.h" #include #if HAVE_UNISTD_H #include #endif #if HAVE_STDARG_H #include #endif #ifdef _WIN32 #if HAVE_IO_H /* Windows */ #include #endif #if HAVE_SOCKET #include #endif #include #ifndef S_ISDIR #define S_ISDIR(x) (((x)&_S_IFDIR)==_S_IFDIR) #endif #endif #if HAVE_ERRNO_H #include #endif #if HAVE_FCNTL_H #include #endif #include "iopreds.h" #if HAVE_TIME_H #include #endif unsigned int current_seed; extern int rand(void); double Yap_random (void) { #if HAVE_DRAND48 return drand48(); #elif HAVE_RANDOM /* extern long random (); */ return (((double) random ()) / 0x7fffffffL /* 2**31-1 */); #elif HAVE_RAND return (((double) (rand ()) / RAND_MAX)); #else Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil, "random not available in this configuration"); return (0.0); #endif } #if HAVE_RANDOM static Int p_init_random_state ( USES_REGS1 ) { register Term t0 = Deref (ARG1); char *old, *new; if (IsVarTerm (t0)) { return(Yap_unify(ARG1,MkIntegerTerm((Int)current_seed))); } if(!IsNumTerm (t0)) return (FALSE); if (IsIntTerm (t0)) current_seed = (unsigned int) IntOfTerm (t0); else if (IsFloatTerm (t0)) current_seed = (unsigned int) FloatOfTerm (t0); else current_seed = (unsigned int) LongIntOfTerm (t0); new = (char *) malloc(256); old = initstate(random(), new, 256); return Yap_unify(ARG2, MkIntegerTerm((Int)old)) && Yap_unify(ARG3, MkIntegerTerm((Int)new)); } static Int p_set_random_state ( USES_REGS1 ) { register Term t0 = Deref (ARG1); char *old, * new; if (IsVarTerm (t0)) { return FALSE; } if (IsIntegerTerm (t0)) new = (char *) IntegerOfTerm (t0); else return FALSE; old = setstate( new ); return Yap_unify(ARG2, MkIntegerTerm((Int)old)); } static Int p_release_random_state ( USES_REGS1 ) { register Term t0 = Deref (ARG1); char *old; if (IsVarTerm (t0)) { return FALSE; } if (IsIntegerTerm (t0)) old = (char *) IntegerOfTerm (t0); else return FALSE; free( old ); return TRUE; } #endif static Int Srandom ( USES_REGS1 ) { register Term t0 = Deref (ARG1); if (IsVarTerm (t0)) { return(Yap_unify(ARG1,MkIntegerTerm((Int)current_seed))); } if(!IsNumTerm (t0)) return (FALSE); if (IsIntTerm (t0)) current_seed = (unsigned int) IntOfTerm (t0); else if (IsFloatTerm (t0)) current_seed = (unsigned int) FloatOfTerm (t0); else current_seed = (unsigned int) LongIntOfTerm (t0); #if HAVE_SRAND48 srand48(current_seed); #elif HAVE_SRANDOM srandom(current_seed); #elif HAVE_SRAND srand(current_seed); #endif return (TRUE); } /** * Initialize the defaulr tandom number generator. * * uses the process's tome call. * */ void Yap_InitRandom (void) { current_seed = (unsigned int) time (NULL); #if HAVE_SRAND48 srand48 (current_seed); #elif HAVE_SRANDOM srandom (current_seed); #elif HAVE_SRAND srand (current_seed); #endif } void Yap_InitRandomPreds (void) { Yap_InitCPred ("srandom", 1, Srandom, SafePredFlag); #if HAVE_RANDOM Yap_InitCPred ("init_random_state", 3, p_init_random_state, SafePredFlag); Yap_InitCPred ("set_random_state", 2, p_set_random_state, SafePredFlag); Yap_InitCPred ("release_random_state", 1, p_release_random_state, SafePredFlag); #endif }