shuffle_1Dilist Subroutine

private subroutine shuffle_1Dilist(data, seed)

Shuffle a 1D array along one dimension

Arguments

Type IntentOptional Attributes Name
integer, intent(inout), dimension(:) :: data

1D array to be shuffled

integer, intent(in), optional :: seed

Random seed


Source Code

  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