(define (map fn lst) (if (null? lst) '() (cons (fn (car lst)) (map fn (cdr lst))))) (define (vector-map fn vec) (define (loop newvec n) (if (< n 0) newvec (begin (vector-set! newvec n (fn (vector-ref vec n))) (loop newvec (- n 1))))) (loop (make-vector (vector-length vec)) (- (vector-length vec) 1))) (define (vector-cons value vec) (define (loop newvec n) (if (= n 0) (begin (vector-set! newvec n value) newvec) (begin (vector-set! newvec n (vector-ref vec (- n 1))) (loop newvec (- n 1))))) (loop (make-vector (+ (vector-length vec) 1)) (vector-length vec))) (define (shuffle1 lst) (define (loop in out n) (if (= n 0) (cons (car in) (shuffle1 (append (cdr in) out))) (loop (cdr in) (cons (car in) out) (- n 1)))) (if (null? lst) '() (loop lst '() (random (length lst))))) (define (shuffle2! lst) (if (null? lst) '() (let ((index (random (length lst)))) (let ((pair ((repeated cdr index) lst)) (temp (car lst))) (set-car! lst (car pair)) (set-car! pair temp) (shuffle2! (cdr lst)) lst)))) (define (shuffle3! vec) (define (loop n) (if (= n 0) vec (let ((index (random n)) (temp (vector-ref vec (- n 1)))) (vector-set! vec (- n 1) (vector-ref vec index)) (vector-set! vec index temp) (loop (- n 1))))) (loop (vector-length vec)))