Racket/Fisher-Yates Shuffle

Från Täpp-Anders
Hoppa till navigeringHoppa till sök

#lang racket

;; Fisher-Yates shuffle för en lista (modern version, O(n))
(define (fisher-yates lst)
  (let ([v (list->vector lst)])          ; Konvertera till vektor för effektiv mutation
    (for ([i (in-range (sub1 (vector-length v)) -1 -1)])  ; från n-1 ner till 1
      (let ([j (random (add1 i))])       ; slumpmässigt index 0 till i (inklusive)
        ;; Byt plats mellan i och j
        (let ([temp (vector-ref v i)])
          (vector-set! v i (vector-ref v j))
          (vector-set! v j temp))))
    (vector->list v)))                   ; Returnera som lista igen

;; Exempel:
(fisher-yates '(1 2 3 4 5 6 7 8 9 10))