MODULE satunnaisluvut USE tarkkuus, ONLY : reaaliluku IMPLICIT NONE PRIVATE REAL (KIND=reaaliluku), SAVE :: talletettu_arvo LOGICAL, SAVE :: talletettu = .FALSE. PUBLIC :: normaali CONTAINS FUNCTION normaali() RESULT(arvo) REAL (KIND=reaaliluku) :: arvo REAL (KIND=reaaliluku), DIMENSION(2) :: x REAL (KIND=reaaliluku) :: x_nelio, apu IF (.NOT. talletettu) THEN silmukka: DO CALL RANDOM_NUMBER(x) x(:) = 2.0*x(:) - 1.0 x_nelio = x(1)**2 + x(2)**2 IF (x_nelio < 1.0 .AND. x_nelio /= 0.0) THEN EXIT silmukka END IF END DO silmukka apu = SQRT(-2.0*LOG(x_nelio)/x_nelio) talletettu_arvo = apu*x(1) talletettu = .TRUE. arvo = apu*x(2) ELSE talletettu = .FALSE. arvo = talletettu_arvo END IF END FUNCTION normaali END MODULE satunnaisluvut PROGRAM satunnaistesti USE satunnaisluvut, ONLY : normaali IMPLICIT NONE INTEGER :: i, n WRITE (*,'(A)',ADVANCE='NO') 'Anna n: ' READ (*,*) n DO i = 1, n WRITE (*,'(F10.6)') normaali() END DO END PROGRAM satunnaistesti