home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / crt / src / rand.c < prev    next >
C/C++ Source or Header  |  1998-06-17  |  2KB  |  82 lines

  1. /***
  2. *rand.c - random number generator
  3. *
  4. *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
  5. *
  6. *Purpose:
  7. *       defines rand(), srand() - random number generator
  8. *
  9. *******************************************************************************/
  10.  
  11. #include <cruntime.h>
  12. #include <mtdll.h>
  13. #include <stddef.h>
  14. #include <stdlib.h>
  15.  
  16. #ifndef _MT
  17. static long holdrand = 1L;
  18. #endif  /* _MT */
  19.  
  20. /***
  21. *void srand(seed) - seed the random number generator
  22. *
  23. *Purpose:
  24. *       Seeds the random number generator with the int given.  Adapted from the
  25. *       BASIC random number generator.
  26. *
  27. *Entry:
  28. *       unsigned seed - seed to seed rand # generator with
  29. *
  30. *Exit:
  31. *       None.
  32. *
  33. *Exceptions:
  34. *
  35. *******************************************************************************/
  36.  
  37. void __cdecl srand (
  38.         unsigned int seed
  39.         )
  40. {
  41. #ifdef _MT
  42.  
  43.         _getptd()->_holdrand = (unsigned long)seed;
  44.  
  45. #else  /* _MT */
  46.         holdrand = (long)seed;
  47. #endif  /* _MT */
  48. }
  49.  
  50.  
  51. /***
  52. *int rand() - returns a random number
  53. *
  54. *Purpose:
  55. *       returns a pseudo-random number 0 through 32767.
  56. *
  57. *Entry:
  58. *       None.
  59. *
  60. *Exit:
  61. *       Returns a pseudo-random number 0 through 32767.
  62. *
  63. *Exceptions:
  64. *
  65. *******************************************************************************/
  66.  
  67. int __cdecl rand (
  68.         void
  69.         )
  70. {
  71. #ifdef _MT
  72.  
  73.         _ptiddata ptd = _getptd();
  74.  
  75.         return( ((ptd->_holdrand = ptd->_holdrand * 214013L
  76.             + 2531011L) >> 16) & 0x7fff );
  77.  
  78. #else  /* _MT */
  79.         return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
  80. #endif  /* _MT */
  81. }
  82.