random.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* random.c (simlib), 20.nov.2002, JH */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <grass/gis.h>
  6. #include <grass/bitmap.h>
  7. #include <grass/linkm.h>
  8. #include <grass/waterglobs.h>
  9. int seeds(long int irand1, long int irand2)
  10. {
  11. seed.is1 = irand1;
  12. seed.is2 = irand2;
  13. return 0;
  14. }
  15. int seedg(long int irand1, long int irand2)
  16. {
  17. irand1 = seed.is1;
  18. irand2 = seed.is2;
  19. return 0;
  20. }
  21. double ulec(void)
  22. {
  23. /* System generated locals */
  24. double ret_val;
  25. /* Local variables */
  26. long int k, iz;
  27. /* uniform random number generator (combined type) */
  28. /* P. L'Ecuyer, Commun. ACM, 31(1988)742 */
  29. /* portable (32 bits arithmetics) */
  30. k = seed.is1 / 53668;
  31. seed.is1 -= k * 53668;
  32. seed.is1 = seed.is1 * 40014 - k * 12211;
  33. /* is1=40014*(is1-k*53668)-k*12211 */
  34. if (seed.is1 < 0) {
  35. seed.is1 += 2147483563;
  36. }
  37. k = seed.is2 / 52774;
  38. seed.is2 -= k * 52774;
  39. seed.is2 = seed.is2 * 40692 - k * 3791;
  40. /* is2=40692*(is2-k*52774)-k*3791 */
  41. if (seed.is2 < 0) {
  42. seed.is2 += 2147483399;
  43. }
  44. iz = seed.is1 - seed.is2;
  45. if (iz < 0) {
  46. iz += 2147483562;
  47. }
  48. ret_val = (double)iz *4.656613e-10;
  49. return ret_val;
  50. } /* ulec */
  51. double gasdev(void)
  52. {
  53. /* Initialized data */
  54. static int iset = 0;
  55. static double gset = .1;
  56. /* System generated locals */
  57. double ret_val;
  58. /* Local variables */
  59. double r = 0., vv1, vv2, fac;
  60. if (iset == 0) {
  61. while (r >= 1. || r == 0.) {
  62. vv1 = ulec() * 2. - 1.;
  63. vv2 = ulec() * 2. - 1.;
  64. r = vv1 * vv1 + vv2 * vv2;
  65. }
  66. fac = sqrt(log(r) * -2. / r);
  67. gset = vv1 * fac;
  68. ret_val = vv2 * fac;
  69. iset = 1;
  70. }
  71. else {
  72. ret_val = gset;
  73. iset = 0;
  74. }
  75. return ret_val;
  76. } /* gasdev */