shuffle.rkt
#lang racket/base

(require (only-in (planet vyzo/crypto:2) random-bytes))

(define (shuffle l)
   (define num-bytes (ceiling (/ (log (length l)) (log 2) 8)))
   (define (random-number . blah)
     (let loop ((left num-bytes) (amount 8) (result 0))
       (if (or (< amount 1) (< left amount))
         (if (< amount 1) result (loop left (/ amount 2) result))
         (if (= amount 1)
           (loop (- left 1) 1 (+ result (bytes-ref (random-bytes 1) 0)))
           (loop
            (- left amount)
            amount
            (+ result (integer-bytes->integer (random-bytes amount) #f)))))))
   (sort l < #:key random-number))

(provide shuffle)