xrand.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <stdlib.h>
  2. #include <grass/config.h>
  3. #include <grass/gis.h>
  4. #include <grass/raster.h>
  5. #include "globals.h"
  6. #include "expression.h"
  7. #include "func_proto.h"
  8. /****************************************************************
  9. rand(lo,hi) random values between a and b
  10. ****************************************************************/
  11. #if !defined(HAVE_DRAND48)
  12. #define drand48() ((double)rand()/((double)RAND_MAX + 1))
  13. #define mrand48() ((long)rand())
  14. #endif
  15. int f_rand(int argc, const int *argt, void **args)
  16. {
  17. int i;
  18. if (argc < 2)
  19. return E_ARG_LO;
  20. if (argc > 2)
  21. return E_ARG_HI;
  22. switch (argt[0]) {
  23. case CELL_TYPE:
  24. {
  25. CELL *res = args[0];
  26. CELL *arg1 = args[1];
  27. CELL *arg2 = args[2];
  28. for (i = 0; i < columns; i++) {
  29. unsigned long x = (unsigned long)mrand48();
  30. int lo = arg1[i];
  31. int hi = arg2[i];
  32. if (lo > hi) {
  33. int tmp = lo;
  34. lo = hi;
  35. hi = tmp;
  36. }
  37. res[i] = (lo == hi) ? lo : lo + x % (unsigned long)(hi - lo);
  38. }
  39. return 0;
  40. }
  41. case FCELL_TYPE:
  42. {
  43. FCELL *res = args[0];
  44. FCELL *arg1 = args[1];
  45. FCELL *arg2 = args[2];
  46. for (i = 0; i < columns; i++) {
  47. double x = drand48();
  48. FCELL lo = arg1[i];
  49. FCELL hi = arg2[i];
  50. if (lo > hi) {
  51. FCELL tmp = lo;
  52. lo = hi;
  53. hi = tmp;
  54. }
  55. res[i] = (FCELL) (lo + x * (hi - lo));
  56. }
  57. return 0;
  58. }
  59. case DCELL_TYPE:
  60. {
  61. DCELL *res = args[0];
  62. DCELL *arg1 = args[1];
  63. DCELL *arg2 = args[2];
  64. for (i = 0; i < columns; i++) {
  65. double x = drand48();
  66. DCELL lo = arg1[i];
  67. DCELL hi = arg2[i];
  68. if (lo > hi) {
  69. DCELL tmp = lo;
  70. lo = hi;
  71. hi = tmp;
  72. }
  73. res[i] = lo + x * (hi - lo);
  74. }
  75. return 0;
  76. }
  77. default:
  78. return E_INV_TYPE;
  79. }
  80. }