subroutine generate_imp_single_excitation(nI, ilut, nJ, ilutnJ, ex, tParity, pGen)
integer, intent(in) :: nI(nel)
integer, intent(out) :: nJ(nel), ex(2, 2)
logical, intent(out) :: tParity
real(dp), intent(inout) :: pGen
integer(n_int), intent(in) :: ilut(0:NIfTot)
integer(n_int), intent(out) :: ilutnJ(0:NIfTot)
integer, allocatable :: destPool(:)
integer :: randSource, randDest, iElec
real(dp) :: r
! first, randomly pick an orb
randSource = pick_source_el_single_excit(nI, ilut, iElec, pGen, destPool)
! Randomly select from the coupled unoccupied orbitals
r = genrand_real2_dSFMT()
randDest = destPool(int(size(destPool) * r) + 1)
! assign the output
! if the excitation is valid, generate the output
call make_single(nI, nJ, iElec, randDest, ex, tParity)
call assign_output_ilut(ilut, ilutnJ, randSource, randDest)
end subroutine generate_imp_single_excitation