home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 299_01 / random.c < prev    next >
Text File  |  1989-12-30  |  3KB  |  76 lines

  1. /****************************************************************************/
  2. /* random.c                                                                 */
  3. /*  (c) by Ronald Michaels. This program may be freely copied, modified,    */
  4. /*  transmitted, or used for any non-commercial purpose.                    */
  5. /* this is an implementation of the pseudorandom number generator as        */
  6. /* described in:  Park, Stephen K., and Miller, Keith W. Random Number      */
  7. /* Generators: Good Ones Are Hard to Find. Communications of the ACM,       */
  8. /* Vol.31,No.10,(October 1988),1192-1201.                                   */
  9. /****************************************************************************/
  10. #include<stdio.h>  /* may be omitted if warning statements are omitted */
  11.  
  12. void s_limits(double,double);
  13. void s_seed(long int);
  14. double d_rand(void);
  15.  
  16. long int seed = 1;
  17. double u_limit = 1.0;
  18. double l_limit = 0.0;
  19.  
  20. /****************************************************************************/
  21. /* s_seed                                                                   */
  22. /* this function sets the initial seed for the random number generator      */
  23. /* default value is 1                                                       */
  24. /****************************************************************************/
  25. void s_seed(long int seed_value)
  26. {
  27.     if(seed_value<1||seed_value>2147483646){
  28.         /* warning statements may be omitted for smaller code */
  29.         printf("\n         ********** WARNING ***********\n");      
  30.         printf("seed for random number must be in the range\n"); 
  31.         printf("1 - 2147483646\n");            
  32.         printf("default value of seed = 1 has been chosen\n");
  33.         printf("press any key to proceed:\n");
  34.         seed = 1;                                   /* leave this statement */
  35.         getch();
  36.         return;
  37.     }
  38.     else{
  39.        seed = seed_value;
  40.         return;
  41.     }
  42. }
  43. /****************************************************************************/
  44. /* s_limits                                                                 */
  45. /* this function sets the upper and lower limits for                        */
  46. /* the random number generator                                              */
  47. /* default limits are 0.0 to 1.0                                            */
  48. /****************************************************************************/
  49. void s_limits(double upper,double lower)
  50. {
  51.     u_limit = upper;
  52.     l_limit = lower;
  53. }
  54. /***************************************************************************/
  55. /* d_rand                                                                  */
  56. /* this function is the pseudorandom number generator                      */
  57. /***************************************************************************/
  58. double d_rand()
  59. {
  60.    long int a = 16807;          /* multiplier */
  61.    long int m = 2147483647;     /* modulus */
  62.    long int q = 127773;         /* m/a */
  63.    long int r = 2836;           /* m%a */
  64.  
  65.    long int lo;
  66.    long int hi;
  67.    long int test;
  68.  
  69.    hi = seed/q;
  70.    lo = seed%q;
  71.    test = a*lo - r*hi;
  72.    if(test>0) seed = test;
  73.    else seed = test + m;
  74.    return(((double)seed/(double)m)*(u_limit-l_limit) + l_limit);
  75. }
  76.