Here is a subroutine (and a test program that calls it) that sets the array of seeds used by random_number() given a single integer input, by using that integer as the initial state of an integer random number generator.
module set_random_seed_mod
implicit none
private
public :: set_random_seed, random_int_32_scalar
contains
pure elemental subroutine random_int_32_scalar(jsr,iran)
! generate random 32-bit integers
integer, intent(in out) :: jsr ! state of RNG
integer, intent(out) :: iran ! random integer
integer :: jz
jz = jsr
jsr = ieor(jsr, ishft(jsr, 13))
jsr = ieor(jsr, ishft(jsr, -17))
jsr = ieor(jsr, ishft(jsr, 5))
iran = jz + jsr
end subroutine random_int_32_scalar
!
subroutine set_random_seed(iseed)
! set the array of seeds used by the random_number() intrinsic
integer, intent(in) :: iseed
integer :: i, jseed, nseeds
integer, allocatable :: seeds(:)
jseed = iseed ! copy iseed to jseed since iseed is intent(in)
call random_seed(size=nseeds)
allocate (seeds(nseeds))
do i=1,nseeds
call random_int_32_scalar(jseed,seeds(i))
end do
call random_seed(put=seeds)
end subroutine set_random_seed
end module set_random_seed_mod
!
program xset_random_seed
use set_random_seed_mod, only: set_random_seed
use iso_fortran_env
implicit none
integer, parameter :: dp = kind(1.0d0), nrepetitions=2
integer :: iseed, irep
real(kind=dp) :: x(5)
print "('compiler_version: ',a)", compiler_version()
iseed = 0
do iseed=0,3
do irep=1,nrepetitions
call set_random_seed(iseed)
call random_number(x)
print "(i0,*(f7.4))", iseed, x
end do
end do
end program xset_random_seed
sample output:
compiler_version: GCC version 13.0.0 20221218 (experimental)
0 0.4711 0.1173 0.8849 0.1863 0.2793
0 0.4711 0.1173 0.8849 0.1863 0.2793
1 0.6147 0.4386 0.7016 0.1485 0.7112
1 0.6147 0.4386 0.7016 0.1485 0.7112
2 0.0599 0.2104 0.7502 0.6672 0.8508
2 0.0599 0.2104 0.7502 0.6672 0.8508
3 0.8717 0.6489 0.2994 0.4425 0.1271
3 0.8717 0.6489 0.2994 0.4425 0.1271