diff --git a/extra/sequences/lib/lib-docs.factor b/extra/sequences/lib/lib-docs.factor index 9975da00db..197d092aa2 100755 --- a/extra/sequences/lib/lib-docs.factor +++ b/extra/sequences/lib/lib-docs.factor @@ -18,3 +18,8 @@ HELP: each-withn "passed to the quotation given to each-withn for each element in the sequence." } { $see-also map-withn } ; + +HELP: randomize +{ $values { "seq" sequence } { "seq'" sequence } } +{ $description "Shuffle the elements in the sequence randomly, returning the new sequence." } ; + diff --git a/extra/sequences/lib/lib.factor b/extra/sequences/lib/lib.factor index 690d7f4b76..8bf95b6bc3 100755 --- a/extra/sequences/lib/lib.factor +++ b/extra/sequences/lib/lib.factor @@ -160,3 +160,16 @@ PRIVATE> : ?nth* ( n seq -- elt/f ? ) 2dup bounds-check? [ nth-unsafe t ] [ 2drop f f ] if ; flushable + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +USE: math.ranges +USE: random +: randomize ( seq -- seq' ) + dup length 1- + [ dup 1 > ] [ + [ [0,b) random ] keep dup + [ rot [ exchange ] keep ] dip 1- + ] [ drop ] while ; + +