I'm using ielm
inside Emacs to randomize an associative list. I'm getting duplicate entries a lot of the time, not sure what I'm doing wrong?
(defun q ()
"Q."
(let ((alist))
(setf alist (q-randomize (q-create-alist)))
alist))
(defun q-create-alist ()
"Create alist."
(let ((alist nil)
(x 0))
;; create alist ((0 . (0 . 0)) (1 . (1 . 1)) (2 . (2 . 2)) ...)
(dotimes (k 1)
(dotimes (v 5)
(push `(,x . (,v . ,k)) alist)
(setf x (1+ x))))
alist))
(defun q-randomize (alist)
"ALIST randomize."
(dotimes (x (length alist))
(setf alist (q-swap alist)))
alist)
(defun q-swap (alist)
"ALIST swap."
(let ((rand nil) (item nil) (swapped nil))
(setf rand (random (length alist)))
;; ignore the first
(if (not (eq 0 rand))
(setf item (assq rand alist)))
;; don't add nil item
(if item
(progn
(setf swapped (delq (assq rand alist) alist))
(setf swapped (cons item alist)))
(setf swapped alist))
swapped))
ELISP> (q)
((3 3 . 0)
(1 1 . 0)
(2 2 . 0)
(4 4 . 0)
(4 4 . 0)
(0 0 . 0))
ELISP> (q)
((1 1 . 0)
(1 1 . 0)
(2 2 . 0)
(3 3 . 0)
(3 3 . 0)
(4 4 . 0)
(0 0 . 0))