<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Approximatrix Forums — Random Numbers]]></title>
		<link>http://forums.approximatrix.com/viewtopic.php?id=484</link>
		<atom:link href="http://forums.approximatrix.com/extern.php?action=feed&amp;tid=484&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[The most recent posts in Random Numbers.]]></description>
		<lastBuildDate>Fri, 01 Mar 2024 01:11:26 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Random Numbers]]></title>
			<link>http://forums.approximatrix.com/viewtopic.php?pid=4291#p4291</link>
			<description><![CDATA[<p>All,</p><p>For those that may have an interest in random number generation in SF, I&#039;ve posted a basic program in SF that uses random numbers.<br />Even though it doesn&#039;t address the original post here, it might be instructive for those interested. Although the code used has been modified by me, it comes from various miscellaneous sources and is not original. I&#039;ve named it WH_RAND after the&nbsp; WICHMAN-HILL method.</p><p>!***********************************************************************<br />!*&nbsp; WH_RAND: UNIFORM RANDOM NUMBER GENERATOR VERSION 3.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />!*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />!*&nbsp; RANF IS A UNIFORM RANDOM NUMBER ROUTINE, ORIGIN IS UNKOWN.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />!*&nbsp; RDUNWH IS USED IN PLACE OF RANF AS A UNIFORM RANDOM NUMBER ROUTINE.*<br />!*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />!*&nbsp; MODIFIED WITH RANDOM SEEDS RANSEED() TO INITIALIZE THE RANDOM SEED *<br />!*&nbsp; USING THE SYSTEM CLOCK TO ALLOW FOR NEWLY GENERATED NUMBERS AFTER&nbsp; *<br />!*&nbsp; EACH EXECUTION OF THE ROUTINE.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />!*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />!*&nbsp; REVISED AND MODIFIED BY F.W. PERRELLA, PH.D.&nbsp; FEBRUARY 29, 2024&nbsp; &nbsp; *<br />!***********************************************************************<br />!<br />!-----------------------------------------------------------------------<br />!---------- MODULES ----------------------------------------------------<br />!-----------------------------------------------------------------------<br />MODULE NRTYPES<br />!--- KIND TYPES FOR 64- AND 32-BIT SIGNED INTEGERS<br />&nbsp; &nbsp; INTEGER, PARAMETER :: I32 = SELECTED_INT_KIND(9)<br />&nbsp; &nbsp; !INTEGER, PARAMETER :: I64 = SELECTED_INT_KIND(18)</p><p>&nbsp; &nbsp; INTEGER, PARAMETER :: SP = SELECTED_REAL_KIND(6)<br />&nbsp; &nbsp; !INTEGER, PARAMETER :: DP = SELECTED_REAL_KIND(15)<br />END MODULE NRTYPES</p><p>MODULE IRANDOM<br />&nbsp; &nbsp; USE NRTYPES<br />&nbsp; &nbsp; INTEGER(I32) :: K2<br />&nbsp; &nbsp; INTEGER(I32) :: IRAND(250)<br />&nbsp; &nbsp; INTEGER(I32) :: IX,IY,IZ<br />END MODULE IRANDOM</p><p>MODULE WH_RAND<br />&nbsp; &nbsp; USE NRTYPES<br />&nbsp; &nbsp; IMPLICIT NONE</p><p>&nbsp; &nbsp; PUBLIC :: RANSEED, RANSET, RANF, RDUNWH</p><p>&nbsp; &nbsp; INTERFACE RANSEED<br />&nbsp; &nbsp; &nbsp; &nbsp; MODULE PROCEDURE RANSEED<br />&nbsp; &nbsp; END INTERFACE RANSEED</p><p>&nbsp; &nbsp; INTERFACE RANSET<br />&nbsp; &nbsp; &nbsp; &nbsp; MODULE PROCEDURE RANSET<br />&nbsp; &nbsp; END INTERFACE RANSET</p><p>&nbsp; &nbsp; INTERFACE RANF<br />&nbsp; &nbsp; &nbsp; &nbsp; MODULE PROCEDURE RANF<br />&nbsp; &nbsp; END INTERFACE RANF</p><p>&nbsp; &nbsp; INTERFACE RDUNWH<br />&nbsp; &nbsp; &nbsp; &nbsp; MODULE PROCEDURE RDUNWH<br />&nbsp; &nbsp; END INTERFACE RDUNWH<br />&nbsp; &nbsp; PRIVATE</p><p>&nbsp; &nbsp; !-------------------------------------------------------------------<br />&nbsp; &nbsp; CONTAINS<br />&nbsp; &nbsp; !-------------------------------------------------------------------</p><p>&nbsp; &nbsp; SUBROUTINE RANSEED(ISEED)<br />&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER(I32), INTENT(OUT) :: ISEED<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER(I32)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :: I<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL(SP)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :: A, AC, AM, R1<br />&nbsp; &nbsp; &nbsp; &nbsp; PARAMETER(A = 4.5875, AC = 45381.6693, AM = 214748.3648)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; CALL INIT_RANDOM_SEED(ISEED)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; I = 0<br />&nbsp; &nbsp; &nbsp; &nbsp; DO WHILE ((ISEED == 0).AND.(I &lt; 10))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; I = I + 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CALL INIT_RANDOM_SEED(ISEED)<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IF(ISEED .EQ. 0) ISEED = 10000<br />&nbsp; &nbsp; &nbsp; &nbsp; IF(ISEED .LT. 0) ISEED = -ISEED</p><p>&nbsp; &nbsp; &nbsp; &nbsp; R1 = 1.0 + MODULO(A*REAL(ISEED) + AC, AM)<br />&nbsp; &nbsp; &nbsp; &nbsp; ISEED = INT(R1)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; END SUBROUTINE RANSEED</p><p>&nbsp; &nbsp; !--- INITIALIZE A RANDOM SEED FROM THE SYSTEM CLOCK AT EVERY RUN.<br />&nbsp; &nbsp; SUBROUTINE INIT_RANDOM_SEED(ISEED)<br />&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER(I32), INTENT(OUT) :: ISEED<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER(I32)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :: I, N, ICLOCK<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER(I32), DIMENSION(:), ALLOCATABLE :: RSEED</p><p>&nbsp; &nbsp; &nbsp; &nbsp; CALL RANDOM_SEED(SIZE = N)<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATE(RSEED(N))</p><p>&nbsp; &nbsp; &nbsp; &nbsp; CALL SYSTEM_CLOCK(COUNT = ICLOCK)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IF (ICLOCK &lt; 0) ICLOCK = 30000<br />&nbsp; &nbsp; &nbsp; &nbsp; RSEED = ICLOCK + 37 * (/ (I - 1, I = 1, N) /)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; CALL RANDOM_SEED(PUT = RSEED)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; ISEED = INT( RSEED(N) )</p><p>&nbsp; &nbsp; &nbsp; &nbsp; DEALLOCATE(RSEED)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; END SUBROUTINE INIT_RANDOM_SEED</p><p>&nbsp; &nbsp; SUBROUTINE RANSET(ISD)<br />&nbsp; &nbsp; &nbsp; &nbsp; USE IRANDOM</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER(I32), INTENT(IN OUT) :: ISD<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER(I32)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:: I, J, K, JRAND, J1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; ISD = MODULO(ISD, 65536)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; DO I = 1, 250<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DO J = 1, 5<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ISD = MODULO(ISD*8973 + 1, 65536) - 32768<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JRAND = ISD*65536<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; J1 = MODULO(I, 2)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DO K = 1, 5<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ISD = MODULO(ISD*8973 + J1, 65536)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IRAND(I) = JRAND + ISD<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; &nbsp; &nbsp; K2 = 1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; END SUBROUTINE RANSET</p><p>&nbsp; &nbsp; FUNCTION RANF()<br />&nbsp; &nbsp; &nbsp; &nbsp; USE IRANDOM</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL(SP)&nbsp; &nbsp; &nbsp;:: RANF<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER(I32) :: L1, IRANF</p><p>&nbsp; &nbsp; &nbsp; &nbsp; L1 = MODULO(K2 + 146, 250) + 1<br />&nbsp; &nbsp; &nbsp; &nbsp; IRANF = IEOR(IRAND(K2), IRAND(L1))</p><p>&nbsp; &nbsp; &nbsp; &nbsp; RANF = REAL(IRANF)*2.328306E-10 + 0.5<br />&nbsp; &nbsp; &nbsp; &nbsp; IRAND(K2) = IRANF<br />&nbsp; &nbsp; &nbsp; &nbsp; K2 = MODULO(K2, 250) + 1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; END FUNCTION RANF</p><p>&nbsp; &nbsp; FUNCTION RDUNWH (IX,IY,IZ)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- GENERATES UNIFORM PSEUDO-RANDOM DEVIATES IN THE<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- INTERVAL [0,1) USING THE WICHMAN-HILL METHOD.<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- AN EXACT VALUE OF ZERO IS POSSIBLE BUT NOT LIKELY.<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- THE CYCLE LENGTH EXCEEDS 6.95E12.<br />&nbsp; &nbsp; &nbsp; &nbsp; !---<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- CURRENT VERSION COMPLETED MAY 15, 1987<br />&nbsp; &nbsp; &nbsp; &nbsp; !---<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- REFERENCE:<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- GRIFFITHS, P. AND HILL, I.D. (EDS.),<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- &#039;APPLIED STATISTICS ALGORITHMS&#039;,<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- THE ROYAL STATISTICAL SOCIETY/ELLIS HARWOOD LIMITED,<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- ALGORITHM AS 183, PP. 238-242 (1985).<br />&nbsp; &nbsp; &nbsp; &nbsp; !---<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- THE INTEGERS IX, IY, AND IZ REQUIRE INTEGER<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- ARITHMETIC UP TO 5,212,632<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- BEFORE THE FIRST CALL TO THIS ROUTINE THE INTEGERS<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- IX, IY, AND IZ SHOULD BE SET TO VALUES WITHIN THE<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- RANGE [1,30000]. AFTER THAT THEIR VALUES SHOULD NOT<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- BE CHANGED EXCEPT BY THIS ROUTINE.<br />&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL(SP)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:: RDUNWH, SUMX<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER(I32), INTENT(IN OUT) :: IX, IY, IZ</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IX = MOD(171*IX,30269)<br />&nbsp; &nbsp; &nbsp; &nbsp; IY = MOD(172*IY,30307)<br />&nbsp; &nbsp; &nbsp; &nbsp; IZ = MOD(170*IZ,30323)<br />&nbsp; &nbsp; &nbsp; &nbsp; SUMX = REAL(IX)/30269.0+REAL(IY)/30307.0+REAL(IZ)/30323.0</p><p>&nbsp; &nbsp; &nbsp; &nbsp; RDUNWH = AMOD(SUMX,1.0)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; END FUNCTION RDUNWH</p><p>END MODULE WH_RAND<br />!-----------------------------------------------------------------------<br />!---------- END MODULES ------------------------------------------------<br />!-----------------------------------------------------------------------</p><p>!-----------------------------------------------------------------------<br />!---------- TEST PROGRAM -----------------------------------------------<br />!-----------------------------------------------------------------------<br />PROGRAM RANDOM_TEST<br />&nbsp; &nbsp; USE NRTYPES<br />&nbsp; &nbsp; USE WH_RAND</p><p>&nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; CHARACTER(1) :: CR<br />&nbsp; &nbsp; INTEGER(I32) :: I, J, K, CNT, N, ISEED, IX,IY,IZ, IXYZ<br />&nbsp; &nbsp; INTEGER(I32) :: NBINS, BIN, YBIN, IFACTOR, ICYCLE, GCOUNT<br />&nbsp; &nbsp; REAL(SP)&nbsp; &nbsp; &nbsp;:: YMIN, YMAX, YMEAN, YSIGMA<br />&nbsp; &nbsp; REAL(SP)&nbsp; &nbsp; &nbsp;:: SUMN, SUMSQ, COVCNT, COVSCORE<br />&nbsp; &nbsp; REAL(SP)&nbsp; &nbsp; &nbsp;:: Y, RANGEX, W, GMEAN, GSIGMA, GSCORE<br />&nbsp; &nbsp; PARAMETER(IFACTOR = 100, ICYCLE = 5)</p><p>&nbsp; &nbsp; ALLOCATABLE :: Y(:), IXYZ(:), BIN(:), YBIN(:), RANGEX(:)<br />&nbsp; &nbsp; ALLOCATE(Y(1), IXYZ(3))<br />&nbsp; &nbsp; ALLOCATE(BIN(IFACTOR), YBIN(IFACTOR), RANGEX(IFACTOR))</p><p>&nbsp; &nbsp; !--- INITIALIZE SEED VALUE<br />&nbsp; &nbsp; CALL RANSEED(ISEED)</p><p>&nbsp; &nbsp; DO I = 1, 3<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- RESET SEED VALUE<br />&nbsp; &nbsp; &nbsp; &nbsp; CALL RANSET(ISEED)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- CHECK THAT THE VALUES IN IN RANGE.<br />&nbsp; &nbsp; &nbsp; &nbsp; IF (ISEED &gt; 30000) THEN<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ISEED = 30000*INT(FLOAT(ISEED - 30000)/FLOAT(ISEED))<br />&nbsp; &nbsp; &nbsp; &nbsp; END IF<br />&nbsp; &nbsp; &nbsp; &nbsp; IF (ISEED == 0) ISEED = 13849 / I<br />&nbsp; &nbsp; &nbsp; &nbsp; IXYZ(I) = ISEED<br />&nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; !--- SEEDS FOR RDUNWH() RANDOM NUMBER GENERATOR<br />&nbsp; &nbsp; IX = IXYZ(1)<br />&nbsp; &nbsp; IY = IXYZ(2)<br />&nbsp; &nbsp; IZ = IXYZ(3)</p><p>&nbsp; &nbsp; !--- GENERATE N*N = 10,000 UNIFORM RANDOM NUMBERS<br />&nbsp; &nbsp; N = 100</p><p>1&nbsp; &nbsp;CONTINUE<br />&nbsp; &nbsp; GMEAN = 0.0<br />&nbsp; &nbsp; GSIGMA = 0.0<br />&nbsp; &nbsp; GSCORE = 0.0<br />&nbsp; &nbsp; GCOUNT = 0.0</p><p>&nbsp; &nbsp; IF (ALLOCATED(Y)) DEALLOCATE (Y)<br />&nbsp; &nbsp; ALLOCATE(Y(N*N))</p><p>&nbsp; &nbsp; WRITE(*,&quot;(/1X,A)&quot;) &#039;WH_RAND UNIFORM RANDOM NUMBER GENERATOR&#039;</p><p>&nbsp; &nbsp; WRITE(*,&quot;(/1X,A,3I6)&quot;) &#039;INITIAL RDUNWH SEEDS IX,IY,IZ =&#039;, IXYZ(1:3)<br />&nbsp; &nbsp; WRITE(*,&quot;(A)&quot;) REPEAT(&#039;~&#039;,40)</p><p>&nbsp; &nbsp; WRITE(*,&quot;(/A)&quot;) REPEAT(&#039;-&#039;,72)</p><p>&nbsp; &nbsp; !--- CALCULATE ICYCLE MEAN VALUES<br />&nbsp; &nbsp; DO K = 1, ICYCLE<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- RESET SEED VALUES<br />&nbsp; &nbsp; &nbsp; &nbsp; J = RDUNWH(IX,IY,IZ)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- STORE NEW SEEDS<br />&nbsp; &nbsp; &nbsp; &nbsp; IXYZ(1) = IX<br />&nbsp; &nbsp; &nbsp; &nbsp; IXYZ(2) = IY<br />&nbsp; &nbsp; &nbsp; &nbsp; IXYZ(3) = IZ</p><p>&nbsp; &nbsp; &nbsp; &nbsp; CNT = 0<br />&nbsp; &nbsp; &nbsp; &nbsp; DO J = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DO I = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CNT = CNT + 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !--- GENERATE AND SAVE RANDOM DATA Y<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !--- Y(CNT) = RANF()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Y(CNT) = RDUNWH(IX,IY,IZ)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- CALCULATE THE MINUMUM AND MAXIMUM VALUES<br />&nbsp; &nbsp; &nbsp; &nbsp; YMIN = MINVAL(Y)<br />&nbsp; &nbsp; &nbsp; &nbsp; YMAX = MAXVAL(Y)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- CALCULATE THE MEAN AND STANDARD DEVIATION<br />&nbsp; &nbsp; &nbsp; &nbsp; SUMN = SUM( Y(:) )<br />&nbsp; &nbsp; &nbsp; &nbsp; SUMSQ = SUM( Y(:)**2 )</p><p>&nbsp; &nbsp; &nbsp; &nbsp; YMEAN = SUMN / FLOAT(CNT)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- YSIGMA = SQRT( SUM( (Y(:) - YMEAN)**2 ) / CNT )<br />&nbsp; &nbsp; &nbsp; &nbsp; YSIGMA = SQRT( SUMSQ/FLOAT(CNT) - YMEAN**2 )</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- The covariance score is computed over each pair of the<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- data set Y, so that Y1 is paired with Y2, Y3 with Y4, etc.<br />&nbsp; &nbsp; &nbsp; &nbsp; COVCNT = 0.0<br />&nbsp; &nbsp; &nbsp; &nbsp; DO I = 1, CNT-1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; COVCNT = COVCNT + (Y(I+1)-YMEAN)*(Y(I)-YMEAN)<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; COVSCORE = COVCNT / FLOAT(CNT-1)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&quot;(1X,A,1X,I6,1X,A,F10.4,2X,A,F10.4,2X,A,F10.4)&quot;) &amp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;COUNT&quot;, CNT, &quot;MEAN=&quot;, YMEAN, &quot; SIGMA=&quot;, YSIGMA, &amp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot; COV SCORE=&quot;, COVSCORE</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IF (ICYCLE &gt; 1) THEN<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !--- GRAND MEAN, GRAND SIGMA, GRAND SCORE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GMEAN = GMEAN + YMEAN<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GSIGMA = GSIGMA + YSIGMA<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GSCORE = GSCORE + COVSCORE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GCOUNT = GCOUNT + CNT<br />&nbsp; &nbsp; &nbsp; &nbsp; END IF<br />&nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; WRITE(*,&quot;(A)&quot;) REPEAT(&#039;-&#039;,72)</p><p>&nbsp; &nbsp; IF (ICYCLE &gt; 1) THEN<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- GRAND AVERAGES<br />&nbsp; &nbsp; &nbsp; &nbsp; GMEAN = GMEAN / FLOAT(ICYCLE)<br />&nbsp; &nbsp; &nbsp; &nbsp; GSIGMA = GSIGMA / FLOAT(ICYCLE)<br />&nbsp; &nbsp; &nbsp; &nbsp; GSCORE = GSCORE / FLOAT(ICYCLE)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&quot;(1X,A,1X,I6,1X,A,F10.4,2X,A,F10.4,2X,A,F10.6)&quot;) &amp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;COUNT&quot;, GCOUNT, &quot;MEAN=&quot;, GMEAN, &amp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot; SIGMA=&quot;, GSIGMA, &quot; COV SCORE=&quot;, GSCORE<br />&nbsp; &nbsp; END IF</p><p>&nbsp; &nbsp; !-------------------------------------------------------------------<br />&nbsp; &nbsp; !--- THIS SECTION USES A SCORE ARRAY AND A RANGE ARRAY, COUNTS<br />&nbsp; &nbsp; !--- THE NUMBER OF EACH SCORES IN EACH RANGE, AND DISPLAYS A<br />&nbsp; &nbsp; !--- HORIZONTAL BAR HISTOGRAM.<br />&nbsp; &nbsp; !-------------------------------------------------------------------<br />&nbsp; &nbsp; !--- CALCULATE THE NUMBER OF BINS FOR Y VALUES<br />&nbsp; &nbsp; W = 5.0 * (FLOAT(IFACTOR)*YSIGMA + 0.10) * (N*N)**(-1.0/3.0)</p><p>&nbsp; &nbsp; !--- ADJUST VALUES BY IFACTOR FOR PLOTTING<br />&nbsp; &nbsp; Y(:) = FLOAT(IFACTOR)*Y(:)<br />&nbsp; &nbsp; YMIN = FLOAT(IFACTOR)*YMIN<br />&nbsp; &nbsp; YMAX = FLOAT(IFACTOR)*YMAX<br />&nbsp; &nbsp; NBINS = INT((YMAX - YMIN) / W)</p><p>&nbsp; &nbsp; WRITE(*,&quot;(/A,F8.3,2X,A,I3)&quot;) &#039;W=&#039;, W, &#039;&nbsp; NBINS=&#039;, NBINS</p><p>&nbsp; &nbsp; !--- CALCULATE THE RANGE OF BINS STARTING AT Y MINIMUM<br />&nbsp; &nbsp; RANGEX(:) = YMIN<br />&nbsp; &nbsp; DO I = 1, NBINS<br />&nbsp; &nbsp; &nbsp; &nbsp; IF ( I .EQ. 1 ) THEN<br />&nbsp; &nbsp; &nbsp; &nbsp; RANGEX(I) = RANGEX(I) + W<br />&nbsp; &nbsp; &nbsp; &nbsp; ELSE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RANGEX(I) = RANGEX(I-1) + W<br />&nbsp; &nbsp; &nbsp; &nbsp; END IF<br />&nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; WRITE(*,&quot;(A)&quot;) REPEAT(&#039;~&#039;,40)</p><p>&nbsp; &nbsp; !--- STORE THE Y VALUES IN THE APPROPRIATE BIN<br />&nbsp; &nbsp; WRITE(*,&quot;(/1X,A)&quot;) &#039;NUMERIC HISTOGRAM&#039;<br />&nbsp; &nbsp; DO I = 1, NBINS<br />&nbsp; &nbsp; &nbsp; &nbsp; YBIN(I) = COUNT( Y(:) .LE. RANGEX(I) )<br />&nbsp; &nbsp; &nbsp; &nbsp; IF( I .GT. 1 ) THEN<br />&nbsp; &nbsp; &nbsp; &nbsp; BIN(I) = YBIN(I) - YBIN(I-1)<br />&nbsp; &nbsp; &nbsp; &nbsp; ELSE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BIN(I) = YBIN(I)<br />&nbsp; &nbsp; &nbsp; &nbsp; ENDIF<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(F10.2,I10)&#039;) RANGEX(I), BIN(I)<br />&nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; WRITE(*,&quot;(A)&quot;) REPEAT(&#039;~&#039;,40)</p><p>&nbsp; &nbsp; !--- DISPLAY HORIZONTAL BAR HISTOGRAM<br />&nbsp; &nbsp; WRITE(*,&quot;(/1X,A)&quot;) &#039;HISTOGRAM PLOT&#039;<br />&nbsp; &nbsp; DO I = 1, NBINS<br />&nbsp; &nbsp; &nbsp; &nbsp; J = INT( FLOAT(BIN(I))/ FLOAT(NBINS) / 1.0 )<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*, &quot;(F4.1, A, A)&quot;) &amp;<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL(I), &quot;: &quot;, REPEAT(&quot;=&quot;, J)<br />&nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; WRITE(*,&quot;(A)&quot;) REPEAT(&#039;~&#039;,40)</p><p>&nbsp; &nbsp; !...END RANDOM NUMBER ROUTINE<br />&nbsp; &nbsp; WRITE(*,&#039;(/A$)&#039;) &quot;PRESS &#039;1&#039; TO CONTINUE OR &#039;ENTER&#039; TO QUIT:&quot;<br />&nbsp; &nbsp; READ(*,&#039;(A)&#039;) CR<br />&nbsp; &nbsp; IF (TRIM(CR) == &quot;1&quot;) THEN<br />&nbsp; &nbsp; &nbsp; &nbsp; GO TO 1<br />&nbsp; &nbsp; ELSE<br />&nbsp; &nbsp; &nbsp; &nbsp; STOP &#039;PROGRAM ENDED...&#039;<br />&nbsp; &nbsp; END IF</p><p>END PROGRAM RANDOM_TEST<br />!-----------------------------------------------------------------------<br />!---------- END TEST PROGRAM -------------------------------------------<br />!-----------------------------------------------------------------------</p>]]></description>
			<author><![CDATA[null@example.com (drfrank)]]></author>
			<pubDate>Fri, 01 Mar 2024 01:11:26 +0000</pubDate>
			<guid>http://forums.approximatrix.com/viewtopic.php?pid=4291#p4291</guid>
		</item>
		<item>
			<title><![CDATA[Re: Random Numbers]]></title>
			<link>http://forums.approximatrix.com/viewtopic.php?pid=4290#p4290</link>
			<description><![CDATA[<p>Terrific! <br />Thank you very much for this information.</p>]]></description>
			<author><![CDATA[null@example.com (david.jeong)]]></author>
			<pubDate>Tue, 27 Feb 2024 19:25:53 +0000</pubDate>
			<guid>http://forums.approximatrix.com/viewtopic.php?pid=4290#p4290</guid>
		</item>
		<item>
			<title><![CDATA[Re: Random Numbers]]></title>
			<link>http://forums.approximatrix.com/viewtopic.php?pid=4289#p4289</link>
			<description><![CDATA[<p>From the runtime library source code:</p><div class="codebox"><pre><code>/*

   We use the xoshiro256** generator, a fast high-quality generator
   that:

   - passes TestU1 without any failures

   - provides a &quot;jump&quot; function making it easy to provide many
     independent parallel streams.

   - Long period of 2**256 - 1

   A description can be found at

   http://prng.di.unimi.it/

   or

   https://arxiv.org/abs/1805.01407

   The paper includes public domain source code which is the basis for
   the implementation below.

*/</code></pre></div><p>Just to be clear, that is the algorithm the current runtime library is using.&nbsp; This algorithm could always change if something better comes along.</p>]]></description>
			<author><![CDATA[null@example.com (jeff)]]></author>
			<pubDate>Tue, 27 Feb 2024 12:47:30 +0000</pubDate>
			<guid>http://forums.approximatrix.com/viewtopic.php?pid=4289#p4289</guid>
		</item>
		<item>
			<title><![CDATA[Re: Random Numbers]]></title>
			<link>http://forums.approximatrix.com/viewtopic.php?pid=4288#p4288</link>
			<description><![CDATA[<p>I am interested in some of the details about the intrinsic (pseudo) random number generator.&nbsp; For example, do you know what algorithm is used, and what is period of the pseudo-random sequence?<br />Thank you.</p>]]></description>
			<author><![CDATA[null@example.com (david.jeong)]]></author>
			<pubDate>Tue, 27 Feb 2024 02:19:11 +0000</pubDate>
			<guid>http://forums.approximatrix.com/viewtopic.php?pid=4288#p4288</guid>
		</item>
		<item>
			<title><![CDATA[Re: Random Numbers]]></title>
			<link>http://forums.approximatrix.com/viewtopic.php?pid=2161#p2161</link>
			<description><![CDATA[<p>I&#039;m not sure how many users are relying on Simply Fortran for writing encryption software, but some might be.&nbsp; Random number generation is quite a complex, yet fascinating, field. Many users might be interested, but probably more for the science behind the document.</p>]]></description>
			<author><![CDATA[null@example.com (jeff)]]></author>
			<pubDate>Fri, 14 Aug 2015 01:24:58 +0000</pubDate>
			<guid>http://forums.approximatrix.com/viewtopic.php?pid=2161#p2161</guid>
		</item>
		<item>
			<title><![CDATA[Random Numbers]]></title>
			<link>http://forums.approximatrix.com/viewtopic.php?pid=2160#p2160</link>
			<description><![CDATA[<p>FYI - <a href="http://csrc.nist.gov/publications/nistbul/itlbul2015_08.pdf">http://csrc.nist.gov/publications/nistb … 015_08.pdf</a><br />Should this affect some Simply Fortran Users?<br />Bob</p>]]></description>
			<author><![CDATA[null@example.com (Bob)]]></author>
			<pubDate>Thu, 13 Aug 2015 13:56:46 +0000</pubDate>
			<guid>http://forums.approximatrix.com/viewtopic.php?pid=2160#p2160</guid>
		</item>
	</channel>
</rss>
