147 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			147 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "sysbits.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if HAVE_TIME_H
							 | 
						||
| 
								 | 
							
								#include <time.h>
							 | 
						||
| 
								 | 
							
								#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
							 | 
						||
| 
								 | 
							
								}
							 |