#include #include "gis.h" #include "globals.h" #include "expression.h" #include "func_proto.h" /********************************************************************** erand(x,y,z) generates random number using given state numbers (each a 16bit int) **********************************************************************/ #if !defined(HAVE_DRAND48) #define erand48(x) ((double)rand()/RAND_MAX) #define nrand48(x) ((long)rand()) #endif int f_erand(int argc, const int *argt, void **args) { static unsigned short state[3] = {0,0,0}; static int assigned = 0; int i; if (argc < 3) return E_ARG_LO; if (argc > 3) return E_ARG_HI; switch (argt[1]) { case CELL_TYPE: { DCELL *res = args[0]; CELL *arg1 = args[1]; CELL *arg2 = args[2]; CELL *arg3 = args[3]; for (i = 0; i < columns; i++) { if (!assigned) { state[0] = (unsigned short) arg1[i]; state[1] = (unsigned short) arg2[i]; state[2] = (unsigned short) arg3[i]; assigned = 1; } double x = erand48(state); //if (lo > hi) { int tmp = lo; lo = hi; hi = tmp; } res[i] = x;//lo + x % (hi - lo); } return 0; } /*case FCELL_TYPE: { FCELL *res = args[0]; FCELL *arg1 = args[1]; FCELL *arg2 = args[2]; FCELL *arg3 = args[3]; for (i = 0; i < columns; i++) { unsigned short a[3] = {(unsigned short) arg1[i], (unsigned short) arg2[i], (unsigned short) arg3[i] }; double x = erand48(a); res[i] = (FCELL) x; } return 0; } case DCELL_TYPE: { DCELL *res = args[0]; DCELL *arg1 = args[1]; DCELL *arg2 = args[2]; DCELL *arg3 = args[3]; for (i = 0; i < columns; i++) { unsigned short a[3] = {(unsigned short) arg1[i], (unsigned short) arg2[i], (unsigned short) arg3[i] }; double x = erand48(a); res[i] = x; } return 0; }*/ default: return E_INV_TYPE; } } int c_int123(int argc, int *argt) { if (argc < 3) return E_ARG_LO; if (argc > 3) return E_ARG_HI; argt[0] = DCELL_TYPE; argt[1] = CELL_TYPE; return 0; }