Shuffle a 1D array along one dimension
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(inout), | dimension(:) | :: | data |
1D array to be shuffled |
|
| integer, | intent(in), | optional | :: | seed |
Random seed |
subroutine shuffle_1Dilist(data,seed) !! Shuffle a 1D array along one dimension implicit none ! Arguments integer, dimension(:), intent(inout) :: data !! 1D array to be shuffled integer, optional, intent(in) :: seed !! Random seed ! Local variables integer :: itmp1, i, j !! Loop indices integer :: istart, num_data, seed_size !! Start index, number of data points, seed size real(real32) :: r !! Random number integer, allocatable, dimension(:) :: iseed !! Random seed ! Set or get random seed !--------------------------------------------------------------------------- call random_seed(size=seed_size) allocate(iseed(seed_size)) if(present(seed))then iseed = seed call random_seed(put=iseed) else call random_seed(get=iseed) end if ! Shuffle the data !--------------------------------------------------------------------------- num_data = size(data,dim=1) istart=1 do i=1,num_data call random_number(r) j = istart + floor((num_data+1-istart)*r) if(i.eq.j) cycle itmp1 = data(j) data(j) = data(i) data(i) = itmp1 end do end subroutine shuffle_1Dilist