Max 5 API Reference
00001 /* 00002 jit.rand.c 00003 00004 Copyright 2001-2005 - Cycling '74 00005 Joshua Kit Clayton jkc@cycling74.com 00006 00007 */ 00008 00009 #include "jit.common.h" 00010 00011 long ran1(long *idum); 00012 long ran2(long *idum); 00013 00014 /* ---- re-entrant random numbers --------- */ 00015 00016 static long seed = 1, seed2 = 1; 00017 static Boolean in=FALSE; 00018 00019 /* 00020 * pseudo-random number generator 00021 * 00022 */ 00023 00024 /** 00025 * Sets global random number generator seed. 00026 * 00027 * @ingroup utilitymod 00028 * 00029 * @param n seed 00030 * 00031 */ 00032 void jit_rand_setseed(long n) 00033 { 00034 if (!n) n = systime_ticks(); 00035 if (!n) n = -777; 00036 if (n>0) n = -n; 00037 seed = seed2 = n; 00038 } 00039 00040 /** 00041 * Generates a random value as a signed long integer. 00042 * 00043 * @ingroup utilitymod 00044 * 00045 * @return random value 00046 * 00047 */ 00048 long jit_rand(void) 00049 { 00050 if (in) { 00051 return (ran2(&seed2)); 00052 } else { 00053 in = TRUE; 00054 return (ran1(&seed)); 00055 in = FALSE; 00056 } 00057 } 00058 00059 // random number generator based on Numerical Recipes "ran1" pp. 280 00060 00061 #define IA 16807 00062 #define IM 2147483647 00063 #define IQ 12773 00064 #define IR 2836 00065 #define NTAB 32 00066 #define NDIV (1+(IM-1)/NTAB) 00067 00068 long ran1(long *idum) 00069 { 00070 long j,k; 00071 static long iy = 0; 00072 static long iv[NTAB]; 00073 00074 if (*idum <= 0 || !iy) { 00075 if (-(*idum) < 1) 00076 *idum = 1; 00077 else 00078 *idum = -(*idum); 00079 for (j = NTAB + 7; j >= 0; j--) { 00080 k = (*idum)/IQ; 00081 *idum = IA * (*idum - k * IQ) - IR * k; 00082 if (*idum < 0) 00083 *idum += IM; 00084 if (j < NTAB) 00085 iv[j] = *idum; 00086 } 00087 } 00088 iy = iv[0]; 00089 k = (*idum)/IQ; 00090 *idum = IA * (*idum - k * IQ) - IR * k; 00091 if (*idum < 0) 00092 *idum += IM; 00093 j = iy/NDIV; 00094 iy = iv[j]; 00095 iv[j] = *idum; 00096 return (iy); 00097 } 00098 00099 long ran2(long *idum) 00100 { 00101 long j,k; 00102 static long iy = 0; 00103 static long iv[NTAB]; 00104 00105 if (*idum <= 0 || !iy) { 00106 if (-(*idum) < 1) 00107 *idum = 1; 00108 else 00109 *idum = -(*idum); 00110 for (j = NTAB + 7; j >= 0; j--) { 00111 k = (*idum)/IQ; 00112 *idum = IA * (*idum - k * IQ) - IR * k; 00113 if (*idum < 0) 00114 *idum += IM; 00115 if (j < NTAB) 00116 iv[j] = *idum; 00117 } 00118 } 00119 iy = iv[0]; 00120 k = (*idum)/IQ; 00121 *idum = IA * (*idum - k * IQ) - IR * k; 00122 if (*idum < 0) 00123 *idum += IM; 00124 j = iy/NDIV; 00125 iy = iv[j]; 00126 iv[j] = *idum; 00127 return (iy); 00128 }
Copyright © 2008, Cycling '74