リストの要素のシャッフル

30分プログラム、その355。bogo sortをやろうと思ったら、シャッフルするための関数がなかったので、そちらから。
リストの要素をいれかえるのは思い気がしたので、いったん配列に変換するようにしてみた。
Erlangの配列は破壊的じゃないんだ。

使い方

1> shuffle:shuffle(lists:seq(1,10)).
[4,7,10,8,5,9,6,3,1,2]
2> shuffle:shuffle(lists:seq(1,10)).
[6,9,5,8,3,2,7,4,10,1]
3> shuffle:shuffle(lists:seq(1,10)).
[1,9,2,7,3,4,10,6,8,5]

ソースコード

-module(shuffle).
-export([init/0,shuffle/1]).

rand(From,To) ->
    random:uniform(To-From) + From - 1.

swap(I,J,Xs) ->
    T = array:get(I,Xs),
    Ys = array:set(I,array:get(J,Xs),Xs),
    array:set(J,T,Ys).

shuffle(Xs) ->
    Ys   = array:from_list(Xs),
    Size = array:size(Ys),
    array:to_list(
      lists:foldl(fun (I,Zs)-> 
			  J = rand(I,Size),
			  swap(I,J,Zs) end,
		  Ys,
		  lists:seq(0,Size-1))).

init()->
    {A1,A2,A3} = now(),
    random:seed(A1, A2, A3).