rand.c 826 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #define _RESEARCH_SOURCE
  2. #include <stdlib.h>
  3. #include <libv.h>
  4. /*
  5. random number generator from cacm 31 10, oct 88
  6. for 32 bit integers (called long here)
  7. */
  8. #ifdef MAIN
  9. #define A 16807
  10. #define M 2147483647
  11. #define Q 127773
  12. #define R 2836
  13. #else
  14. #define A 48271
  15. #define M 2147483647
  16. #define Q 44488
  17. #define R 3399
  18. #endif
  19. static long seed = 1;
  20. void
  21. srand(unsigned int newseed)
  22. {
  23. seed = newseed;
  24. }
  25. long
  26. lrand(void)
  27. {
  28. long lo, hi, test;
  29. hi = seed/Q;
  30. lo = seed%Q;
  31. test = A*lo - R*hi;
  32. if(test > 0)
  33. seed = test;
  34. else
  35. seed = test+M;
  36. return(seed);
  37. }
  38. int
  39. rand(void)
  40. {
  41. return lrand()%(RAND_MAX+1);
  42. }
  43. #ifdef MAIN
  44. main()
  45. {
  46. int i;
  47. for(i = 0; i < 10000; i++)
  48. rand();
  49. if(seed == 1043618065)
  50. printf(" rand: pass\n");
  51. else
  52. printf("*****rand: fail; seed=%u, should be 1043618065\n", seed);
  53. exit(0);
  54. }
  55. #endif