;; [a] -> [a] (define shuffle (lambda (l) (let ((q (map (lambda (e) (cons (random 0 1) e)) l)) (c (lambda (a b) (compare (car a) (car b))))) (map cdr (sort-by c q))))) ;; [float] -> float -> int (define w-index (lambda (w n) (find-index (lambda (e) (< n e)) (integrate w)))) ;; [a] -> [float] -> a (define w-choose (lambda (l w) (list-ref l (w-index w (random 0 1))))) ;; [float] -> [float] (define normalize-sum (lambda (l) (let ((n (foldl1 + l))) (map (lambda (e) (/ e n)) l)))) ;; [a] -> [float] -> a (define p-choose (lambda (l p) (w-choose l (normalize-sum p)))) ;; #[a] -> a (define vector-choose (lambda (v) (vector-ref v (i-random 0 (vector-length v)))))