(defun nshuffle (sequence) (etypecase sequence (list (nshuffle-list sequence)) (array (nshuffle-array sequence)))) (defun nshuffle-list (list) "Shuffle the list using an intermediate vector." (let ((array (nshuffle-array (coerce list 'vector)))) (declare (dynamic-extent array)) (map-into list 'identity array))) (defun nshuffle-array (array) (loop for i from (length array) downto 2 do (rotatef (aref array (random i)) (aref array (1- i))) finally (return array)))