yodize pasted by certainty on Fri May 17 19:43:21 2013
(define (shuffle ls) (let ((len (length ls))) (or (and (< len 2) ls) (let ((item (list-ref ls (random len)))) (cons item (shuffle (remove (cut equal? <> item) ls))))))) (define yodize (o string-join shuffle (cut string-split <> " ")))
Another shuffle pasted by Der on Fri May 17 21:51:11 2013
(define (shuffle ls)
(let ((len (length ls)))
(if (< len 2)
ls
(let loop ((x (random len))
(a '())
(b ls))
(if (zero? x)
(append (shuffle (reverse b))
(shuffle a))
(loop (- x 1)
(cons (car b) a)
(cdr b)))))))
ex-chicken shuffle pasted by mario-goulart on Fri May 17 21:59:28 2013
(define shuffle
(lambda (l random)
(let ((len (length l)))
(map cdr
(sort! (map (lambda (x) (cons (random len) x)) l)
(lambda (x y) (< (car x) (car y)))) ) ) ) )
Simplistic shuffle pasted by DerGuteMoritz on Fri May 17 22:05:23 2013
(define (shuffle ls)
(sort ls (lambda _ (zero? (random 2)))))
succinct pasted by florz on Sat May 18 11:48:40 2013
(use srfi-1) (define (shuffle l) (if (null? l) '() (receive (h t) (split-at l (random (length l))) (cons (car t) (shuffle (append h (cdr t)))))))
presumably more efficient pasted by florz on Sat May 18 11:49:51 2013
(define (shuffle l)
(let ((v (list->vector l)))
(let loop ((i (vector-length v))
(r '()))
(if (zero? i)
r
(let* ((x (random i))
(in (- i 1))
(rn (cons (vector-ref v x) r)))
(vector-set! v x (vector-ref v in))
(loop in rn))))))
Knuth's "Algorithm P" added by Saeren on Sat May 18 17:07:58 2013
;;; Permute (shuffle): Return a random permutation of input vector. From Knuth ;;; "Algorithm P" (3rd ed, vol. 2, p. 145). ;;; vec: vector to permute ;;; Note that rint will have to be replaced with a different RNG proc. (define (permute vec) (do ((x (f64vector-quick-copy vec)) (j (fx- (f64vector-length vec) 1) (fx- j 1))) ((= j 0) x) (f64vector-swap! x j (rint 0 j))))