diff --git a/examples/shuffling.rkt b/examples/shuffling.rkt new file mode 100644 index 0000000..9796fe8 --- /dev/null +++ b/examples/shuffling.rkt @@ -0,0 +1,24 @@ +#lang planet dyoo/whalesong + + + +;; shuffle: vector -> vector +;; Reorders the contents of a vector according to the Fisher-Yates shuffling algorithm. +(define (shuffle! a-vec) + (letrec ([iter (lambda (i) + (cond + [(<= i 0) + a-vec] + [else + (let* ([index (random (add1 i))] + [t (vector-ref a-vec i)]) + (vector-set! a-vec i (vector-ref a-vec index)) + (vector-set! a-vec index t) + (iter (sub1 i)))]))]) + (iter (sub1 (vector-length a-vec))))) + +(shuffle! (vector)) +(shuffle! (vector 'one)) +(shuffle! (vector 1 2)) +(shuffle! (vector "red" "white" "blue")) +(shuffle! (list->vector (string->list "abcdefghijklmnopqrstuvwxyz")))