random.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /* random.c */
  2. #include <grass/gis.h>
  3. #include <grass/glocale.h>
  4. #include "ransurf.h"
  5. #define M1 259200
  6. #define IA1 7141
  7. #define IC1 54773
  8. #define RM1 (1.0/M1)
  9. #define M2 134456
  10. #define IA2 8121
  11. #define IC2 28411
  12. #define RM2 (1.0/M2)
  13. #define M3 243000
  14. #define IA3 4561
  15. #define IC3 51349
  16. /* ran1() returns a double with a value between 0.0 and 1.0 */
  17. double ran1(void)
  18. {
  19. static long ix1, ix2, ix3;
  20. static double r[98];
  21. double temp;
  22. static int iff = 0;
  23. int j;
  24. G_debug(2, "ran1()");
  25. if (Seed < 0 || iff == 0) {
  26. iff = 1;
  27. ix1 = (IC1 - Seed) % M1;
  28. ix1 = (IA1 * ix1 + IC1) % M1;
  29. ix2 = ix1 % M2;
  30. ix1 = (IA1 * ix1 + IC1) % M1;
  31. ix3 = ix1 % M3;
  32. for (j = 1; j <= 97; j++) {
  33. ix1 = (IA1 * ix1 + IC1) % M1;
  34. ix2 = (IA2 * ix2 + IC2) % M2;
  35. r[j] = (ix1 + ix2 * RM2) * RM1;
  36. }
  37. Seed = 1;
  38. }
  39. ix1 = (IA1 * ix1 + IC1) % M1;
  40. ix2 = (IA2 * ix2 + IC2) % M2;
  41. ix3 = (IA3 * ix3 + IC3) % M3;
  42. j = 1 + ((97 * ix3) / M3);
  43. if (j > 97 || j < 1)
  44. G_fatal_error(_("RAN1: j == %d shouldn't happen"), j);
  45. temp = r[j];
  46. r[j] = (ix1 + ix2 * RM2) * RM1;
  47. return temp;
  48. }