Consider the following piece of code. It gets the current random seed (=
seed0), modifies it (=
seed1), put the modified seed back, and then get immediately the random seed again (=
seed2). As far as I understand, we should have
seed1 == seed2 so that the program should print 0, unless
seed1 is not a valid seed.
program testrand implicit none integer :: n integer, allocatable :: seed0(:), seed1(:), seed2(:) ! Initialize the seed, and get its size. call random_seed() call random_seed(size=n) allocate (seed0(n), seed1(n), seed2(n)) ! Get the current seed. call random_seed(get=seed0) ! Modify the seed, and put it as the new seed. seed1 = max(seed0 - 1, 1) ! In most cases, `seed1` should still be a valid seed, no？ call random_seed(put=seed1) ! Get the new seed. call random_seed(get=seed2) ! Check whether the new seed is the one we put. print *, maxval(abs(seed2 - seed1)) end program testrand
The aforementioned speculation seems correct with
af95 (Absoft), and
sunf95 (Oracle). However, with
nagfor (NAG Fortran Compiler Release 7.0(Yurakucho) Build 7036), the printed number is never 0 on my machine (Ubuntu 20.04).
If we do not modify
seed0 but set
seed1=seed0, then all the compilers will print
0 as expected.
Did I overlook something about