home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / fortran / demoran.for < prev    next >
Encoding:
Text File  |  1988-08-11  |  2.9 KB  |  109 lines

  1.     PROGRAM DEMORAN
  2. c
  3. c  This program demonstrates a uniform pseudo-random number
  4. c  generator. 
  5. c
  6. c  Portions of this program are based on ideas presented in the
  7. c  the book "Numerical Recipes - The Art of Scientific Computing"
  8. c  by William H. Press, Brian P. Flannery, Saul A. Teukolsky, and 
  9. c  William T. Vetterling, Cambridge University Press 1986
  10. c
  11. c  If 1000 numbers and 10 bins are requested, each bin should
  12. c  (ideally) be filled with 100 numbers. The percentage error
  13. c  is printed for each bin.
  14. c
  15. c  The following routines are provided:
  16. c
  17. c  REAL FUNCTION RAND () 
  18. c    returns a real number in the range 0. to 1.0
  19. c  INTEGER FUNCTION RANDLIM (ILO,IHI)
  20. c    returns a random integer in the range ILO to IHI
  21. c
  22. c  REAL FUNCTION SRAND (SEED)
  23. c    initializes either generator (seed = 0. to 259199.)
  24. c
  25. c  SUBROUTINE SECOND (TX)
  26. c    returns the number of seconds and hundreths of seconds elapsed
  27. c    since midnight
  28. c
  29. c
  30. c  NOTE -- Both generators should produce identical results
  31. c
  32.     INTEGER BINS(0:999), RANDLIM
  33.     ERR(I) = (I-FLOAT(NREP/NBINS))/(NREP/NBINS)*100.
  34.     WRITE (*,*) 'You will be asked to provide the following:'
  35.     WRITE (*,*) 'how many random numbers to generate'
  36.     WRITE (*,*) 'how many bins to use (1-1000)'
  37.     WRITE (*,*) 'which generator to use (1 or 2)'
  38.     WRITE (*,*)
  39. 10    CONTINUE
  40.     WRITE (*,*) 'Input three numbers separated by blanks or commas'
  41.     WRITE (*,*) 'or CTRL-Z to end'
  42.     READ (*,*,END=999) NREP,NBINS,IGEN
  43.     SEED = SRAND(1.0)
  44.     CALL SECOND (T1)
  45.     DO 100 I=1,NREP
  46.       IF (IGEN .EQ. 1) THEN
  47.             IX = RANDLIM(0,NBINS-1)
  48.       ELSE
  49.         IX = NBINS*RAND()
  50.       ENDIF
  51.       BINS(IX) = BINS(IX)+1
  52. 100    CONTINUE
  53.     CALL SECOND (T2)
  54.     WRITE (*,*) 'Time elapsed=',t2-t1
  55.     WRITE (*,*) 'Numbers generated per second=',nrep/(t2-t1)
  56.     WRITE (*,*)
  57.     WRITE (*,*) 'Bin    Count  % Error'
  58.     WRITE (*,*) '----  ------- -------'
  59.     DO 200 I=0,NBINS-1
  60.       WRITE (*,'(1x,i4,i9,f7.1,''%'')') i+1,bins(i),err(bins(i))
  61.           BINS(I) = 0
  62. 200    CONTINUE
  63.     GO TO 10
  64. 999    CONTINUE
  65.     END
  66.     FUNCTION RANDOM ()
  67. c
  68. c  If called, RANDOM just returns 0.0
  69. c
  70.     INTEGER RANDLIM
  71.     PARAMETER (IA=7141, IC=54773, IM=259200)
  72.     RANDOM = 0.0
  73.     RETURN
  74. c
  75. c  REAL FUNCTION SRAND (SEED)
  76. c    initializes either generator (seed = 0. to 259199.)
  77. c
  78.     ENTRY SRAND (X)
  79.     SRAND = X
  80.         SEED = X
  81.     RETURN
  82. c  INTEGER FUNCTION RANDLIM (ILO,IHI)
  83. c    returns a random integer in the range ILO to IHI
  84. c
  85.     ENTRY RANDLIM (ILO,IHI)
  86.     SEED = MOD (INT(SEED)*IA+IC,IM)
  87.     RANDLIM = ILO+(IHI-ILO+1)*SEED/IM
  88.     RETURN
  89. c
  90. c  REAL FUNCTION RAND () 
  91. c    returns a real number in the range 0. to 1.0
  92.     ENTRY RAND ()
  93.     SEED = MOD (INT(SEED)*IA+IC,IM)
  94.     RAND = SEED/IM
  95.     END
  96.     SUBROUTINE SECOND (TX)
  97. c
  98. c  SUBROUTINE SECOND (TX)
  99. c    returns the number of seconds and hundredths of seconds elapsed
  100. c    since midnight
  101. c
  102.     INTEGER*2 IH,IM,IS,IHU
  103.     CALL GETTIM (IH,IM,IS,IHU)
  104.     TX = IH*3600.+IM*60+IS+IHU/100.
  105.     END
  106.