16 lines
529 B
Common Lisp
16 lines
529 B
Common Lisp
(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)))
|