view gcc/testsuite/gfortran.dg/random_init_3.f90 @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
line wrap: on
line source

! { dg-do run }
! { dg-options "-fcoarray=single" }
program rantest

   implicit none

   logical, parameter :: debug = .false.
   character(len=20) name
   integer fd, i, n
   integer, allocatable :: n1(:), n2(:), n3(:)
   real x(4), y(4), z(4)

   if (debug) then
      write(name,'(A,I0)') 'dat', this_image()
      open(newunit=fd, file=name)
   end if

   call random_seed(size=n)
   allocate(n1(n), n2(n), n3(n))
   !
   ! Setup repeatable sequences (if co-arrays the seeds should be distinct
   ! are different).  Get the seeds.
   !
   call random_init(.true., .true.)
   call random_seed(get=n1)
   call random_number(x)               ! This changes internal state.
   if (debug) then
      write(fd,'(A,4F12.6)') 'x = ', x
   end if

   call random_seed(get=n2)            ! Grab current state. 
   !
   ! Use the gotten seed to reseed PRNG and grab sequence.
   ! It should be the same sequence.
   !
   call random_seed(put=n1)
   call random_number(y)
   if (debug) then
      write(fd,'(A,4F12.6)') 'y = ', y
   end if
   !
   ! Setup repeatable sequences (if co-arrays the seeds should be distinct
   ! are different).  Get the seeds.  It should be the same sequence.
   !
   call random_init(.true., .true.)
   call random_seed(get=n3)
   call random_number(z)
   if (debug) then
      write(fd,'(A,4F12.6)') 'z = ', z
   end if

   x = int(1e6*x) ! Convert to integer with at most 6 digits.
   y = int(1e6*y) ! Convert to integer with at most 6 digits.
   z = int(1e6*z) ! Convert to integer with at most 6 digits.

   if (any(x /= y)) call abort
   if (any(x /= z)) call abort

   if (debug) then
      write(fd,*)
      do i = 1, n
         if (n1(i) - n2(i) /= 0) then
            write(fd,*) 'n1 /= n2', i, n1(i), n2(i)
         end if
      end do
      write(fd,*)
      do i = 1, n
         if (n1(i) - n3(i) /= 0) then
            write(fd,*) 'n1 /= n3', i, n1(i), n3(i)
         end if
      end do
   end if

end program rantest