# # Shuffling

To use the bindings from this module:

(import :std/misc/shuffle)

## # shuffle

(shuffle lst) -> list

lst := proper list to shuffle

Creates a pseudo-random permutation of the values in lst and returns a new list. lst will not be modified during this.

Implementation detail: lst is converted to a random-access vector first, which is then shuffled via vector-shuffle!, and finally converted back to a proper list.

Examples:

> (def lst [1 2 3 4 5])

> (shuffle lst)
(2 1 3 5 4)

> (shuffle lst)
(3 4 2 1 5)

> lst
(1 2 3 4 5)    ; lst is unaffected by the shuffling

## # vector-shuffle

(vector-shuffle vec) -> vector

vec := vector to shuffle

Creates a pseudo-random permutation of the values in vec and returns a new vector. vec will not be modified during this.

Implementation detail: vec is copied first, and it is this very copy that is then shuffled via vector-shuffle!.

Examples:

> (def vec #(1 2 3 4 5))

> (vector-shuffle vec)
#(2 1 5 4 3)

> (vector-shuffle vec)
#(4 2 5 1 3)

> vec
#(1 2 3 4 5)    ; vec is unaffected by the shuffling

## # vector-shuffle!

(vector-shuffle! vec) -> vector

vec := vector to shuffle

Creates a pseudo-random permutation of the values in vec, but does so in-place, which means that vec will be modified directly instead of allocating a new vector.

Implementation detail: The shuffling is performed according to Sattolo's algorithm, a Fisher-Yates shuffle variant.

Examples:

> (def vec #(1 2 3 4 5))

> (vector-shuffle! vec)
#(3 4 1 5 2)

> (vector-shuffle! vec)
#(3 1 5 4 2)

> vec
#(3 1 5 4 2)