[plt-scheme] Scheme implementation of Fisher-Yates shuffle

From: Amit Saha (lists.amitsaha at gmail.com)
Date: Sun Aug 9 10:05:18 EDT 2009

Hello all,

Here is my Scheme implementation of the "modern" version of the "Fisher 
Yates Shuffle" 
(http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle). I am 
sharing this with the hope that it may be useful to someone in the 

#lang scheme

;; Fisher-Yates shuffling algorithm in Scheme (plt-scheme)
;; Amit Saha (http://amitksaha.wordpress.com; amitsaha.in at gmail.com)

;; Useful to obtain a random shuffle of a list
;; call with (shuffle <your list>)

(define (shuffle deck)
    (let loop ((n (length deck)) (shuff_deck (list->vector deck)))
      (if (<= n 1)
	 (set! n (- n 1))
	 (let* ([rand (random (+ 1 n))]
	       [tmp (vector-ref shuff_deck rand)]
	   (vector-set! shuff_deck rand (vector-ref shuff_deck n))
	   (vector-set! shuff_deck n tmp))
        (loop n shuff_deck)))))

At the same time, I would appreciate any feedback on the implementation.

Best Regards,
Journal: http://amitksaha.wordpress.com
µ-blog: http://twitter.com/amitsaha
IRC: cornucopic on #scheme, #lisp, #math, #linux

Posted on the users mailing list.