home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum7.lzh / C / HINTERHALT / rand.c < prev   
Text File  |  2009-11-06  |  3KB  |  60 lines

  1. /******************************************************************************/
  2. /*                                                                            */
  3. /*                                RAND.R                                      */
  4. /*                                                                            */
  5. /*                       Zufallszahlengenerator                               */
  6. /*  Werte fuer M und A aus 'Angewandte Statistik' von Karl Bosch.             */
  7. /*  Die Werte koennen auch geaendert werden.                                  */
  8. /*                                                                            */
  9. /******************************************************************************/
  10.  
  11. #define M 2147483648
  12. #define A 65539
  13.  
  14. static unsigned int y = 0;
  15.  
  16. randomize ()                                /* Initialisierung der Zufalls-   */
  17.                                             /* reihe                          */
  18. {
  19.     int time, date, tick, err;
  20.     short day;
  21.     extern unsigned int y;
  22.     
  23.     err = _sysdate (1, &time, &date, &day, &tick); /* Systemzeit in juliani-  */
  24.                                                 /* scher Form                 */
  25.     if (err == -1) exit (_errmsg (errno, "Fehler bei Systemzeit\n"));
  26.     y = time;                                   /* Sekunden seit Mitternacht  */
  27.     if (y % 2 == 0) y++;                        /* y muss ungerade sein       */
  28. }
  29.  
  30. double rnd (parm)                               /* Ausgabe einer Zufallszahl  */
  31. unsigned short parm;                            /* parm = 0: alt  1: neu      */
  32. {
  33.     double r;
  34.     static double rstat;
  35.     extern unsigned int y;
  36.     
  37.     if (y == 0) exit (_errmsg (1, "Zufallsreihe nicht Initialisiert\n"));
  38.     if (parm > 1) exit (_errmsg (1, "Func rnd(): Parameter zu gro▀\n"));
  39.     y = (A * y) % M;                            /* Berechnung des neuen y     */
  40.     r = -1.0 * ((double) y / (double) M);       /* Zufallszahl zw. 0 und 1    */
  41.     if (parm == 0) return (rstat);              /* Ausgabe der alten Zufallsz.*/
  42.     rstat = r;
  43.     return (r);
  44. }
  45.  
  46. unsigned long rndx (a, b, parm)                 /* Ausgabe einer Zufallszahl  */
  47. unsigned long a;                                /* zwischen a und b           */
  48. unsigned long b;
  49. unsigned short parm;                            /* parm = 0: alt  1: neu      */
  50. {
  51.     unsigned long r;
  52.     
  53.     if (a >= b) exit (_errmsg (1, "Func rndx(): 2. Parameter gr÷▀er als 1.\n"));
  54.     if (parm > 1) exit (_errmsg (1, "Func rndx(): 3. Parameter zu gro▀\n"));
  55.     b++;                                        /* damit r den Wert von b er- */
  56.                                                 /* reichen kann.              */
  57.     r = rnd (parm) * (b - a) + a;
  58.     return (r);
  59. }
  60.