(module fisher-yates mzscheme (require (lib "contract.ss")) (provide/contract [shuffle! ((vectorof any/c) . -> . (vectorof any/c))]) ;; shuffle!: (vectorof X) -> (vectorof X) ;; fisher-yates shuffle. (define (shuffle! von) (let loop ([n (sub1 (vector-length von))]) (cond [(< n 0) von] [else (let* ([k (random (add1 n))] [t (vector-ref von k)]) (vector-set! von k (vector-ref von n)) (vector-set! von n t) (loop (sub1 n)))]))))