SUBROUTINE RandomBitArray_i_sp(array,n_elements,range) IMPLICIT NONE INTEGER(KIND=i_wp),INTENT(IN)::n_elements INTEGER(KIND=i_sp),DIMENSION(n_elements),INTENT(OUT)::array INTEGER(KIND=i_sp),DIMENSION(2),INTENT(IN),OPTIONAL::range INTEGER(KIND=i_wp)::element INTEGER(KIND=i_32)::temp_uniform(i_sp,range,32) DO element=1,n_elements temp_uniform=ISHFT(IEOR(ISHFT(seeds32(1),6),seeds32(1)),-13) seeds32(1)=IEOR(ISHFT(IAND(seeds32(1),-2_i_32),18),temp_uniform) temp_uniform=ISHFT(IEOR(ISHFT(seeds32(2),2),seeds32(2)),-27) seeds32(2)=IEOR(ISHFT(IAND(seeds32(2),-8_i_32),2),temp_uniform) temp_uniform=ISHFT(IEOR(ISHFT(seeds32(3),13),seeds32(3)),-21) seeds32(3)=IEOR(ISHFT(IAND(seeds32(3),-16_i_32),7),temp_uniform) temp_uniform=ISHFT(IEOR(ISHFT(seeds32(4),3),seeds32(4)),-12) seeds32(4)=IEOR(ISHFT(IAND(seeds32(4),-128_i_32),13),temp_uniform) array(element)=IEOR(IEOR(IEOR(seeds32(1),seeds32(2)),seeds32(3)),seeds32(4)) IF(PRESENT(range))THEN array(element)=ABS(array(element))/(HUGE(1_i_32)/(range(2)-range(1)+1))+range(1) END IF END DO END SUBROUTINE SUBROUTINE RandomBitArray_i_dp(array,n_elements,range) IMPLICIT NONE INTEGER(KIND=i_wp),INTENT(IN)::n_elements INTEGER(KIND=i_dp),DIMENSION(n_elements),INTENT(OUT)::array INTEGER(KIND=i_dp),DIMENSION(2),INTENT(IN),OPTIONAL::range INTEGER(KIND=i_wp)::element INTEGER(KIND=i_64)::temp_uniform(i_dp,range,64) DO element=1,n_elements temp_uniform=ISHFT(IEOR(ISHFT(seeds64(1),1),seeds64(1)),-53) seeds64(1)=IEOR(ISHFT(IAND(seeds64(1),-2_i_64),10),temp_uniform) temp_uniform=ISHFT(IEOR(ISHFT(seeds64(2),24),seeds64(2)),-50) seeds64(2)=IEOR(ISHFT(IAND(seeds64(2),-512_i_64),5),temp_uniform) temp_uniform=ISHFT(IEOR(ISHFT(seeds64(3),3),seeds64(3)),-23) seeds64(3)=IEOR(ISHFT(IAND(seeds64(3),-4096_i_64),29),temp_uniform) temp_uniform=ISHFT(IEOR(ISHFT(seeds64(4),5),seeds64(4)),-24) seeds64(4)=IEOR(ISHFT(IAND(seeds64(4),-131072_i_64),23),temp_uniform) temp_uniform=ISHFT(IEOR(ISHFT(seeds64(5),3),seeds64(4)),-33) seeds64(5)=IEOR(ISHFT(IAND(seeds64(5),-8388608_i_64),8),temp_uniform) array(element)=IEOR(IEOR(IEOR(IEOR(seeds64(1),seeds64(2)),seeds64(3)),seeds64(4)),seeds64(5)) IF(PRESENT(range))THEN array(element)=ABS(array(element))/(HUGE(1_i_64)/(range(2)-range(1)+1))+range(1) END IF END DO END SUBROUTINE PROGRAM Random_Test USE Precision,ONLY:i_sp,i_dp,r_sp,r_dp USE Random_Numbers USE StopWatch IMPLICIT NONE INTEGER,PARAMETER::i_wp=i_sp,r_wp=r_sp INTEGER,PARAMETER::n_points=1000000 INTEGER,PARAMETER::n_reps=10 INTEGER::point,reps INTEGER(KIND=i_wp)::i_number INTEGER(KIND=i_wp),DIMENSION(n_points)::i_array_1 INTEGER(KIND=i_wp),DIMENSION(n_points/10,10)::i_array_2 REAL(KIND=r_wp)::r_number REAL(KIND=r_wp),DIMENSION(n_points)::r_array_1 REAL(KIND=r_wp),DIMENSION(n_points/10,10)::r_array_2 REAL(KIND=r_wp),DIMENSION(n_points)::n_array TYPE(WATCHTYPE),DIMENSION(7)::watch OPEN(FILE="test.dat",UNIT=10,STATUS="REPLACE",ACTION="WRITE") CALL CREATE_WATCH(watch,name=(/"RandomBits or random_number ",& "RandomUniform-contiguous rank 1 ",& "RandomUniform-contiguous rank 2 ",& "RandomUniform-loops rank 1 ",& "RandomUniform-loops rank 2 ",& "RandomUniform-with range, rank 1 ",& "RandomNormal-with mean_std "/)) CALL UnpredictableSeeds() DO reps=1,n_reps CALL START_WATCH(watch(1)) CALL RANDOM_NUMBER(r_array_1) CALL STOP_WATCH(watch(1)) CALL START_WATCH(watch(2)) CALL RandomUniform(r_array_1,n_points) CALL STOP_WATCH(watch(2)) CALL START_WATCH(watch(3)) CALL RandomUniform(r_array_2,n_points/10,10) CALL STOP_WATCH(watch(3)) CALL START_WATCH(watch(4)) CALL RandomUniform(r_array_1) CALL STOP_WATCH(watch(4)) CALL START_WATCH(watch(5)) CALL RandomUniform(r_array_2) CALL STOP_WATCH(watch(5)) CALL START_WATCH(watch(6)) CALL RandomUniform(r_array_1,range=(/3.0_r_wp,5.0_r_wp/)) CALL STOP_WATCH(watch(6)) CALL START_WATCH(watch(7)) CALL RandomNormal(n_array,mean_std=(/10.0_r_wp,2.0_r_wp/)) CALL STOP_WATCH(watch(7)) END DO CALL PRINT_WATCH(watch) DO point=1,min(10000,n_points) WRITE(UNIT=10,FMT=*)r_array_1(point),n_array(point) END DO END PROGRAM Random_Test