Vim script でリストをシャッフルする

簡単に書いてみた。
乱数生成は vital.vim で。

[ソース]

let s:random = vital#of("vital").import("Random.Xor128")
call s:random.srand(localtime())

function! s:rand()
    return s:random.rand()
endfunction

function! s:shuffle(list)
    let list = a:list
    let i = len(list)
    while i
        let i -= 1
        let j = s:rand() * i % len(list)
        if i == j
            continue
        endif
        let k = list[i]
        let list[i] = list[j]
        let list[j] = k
    endwhile
    return list
endfunction


function! s:main()
    echo s:shuffle(range(10))
    echo s:shuffle(range(10))
    echo s:shuffle(range(10))
    echo s:shuffle(range(10))
    echo s:shuffle(range(10))
endfunction
call s:main()

[出力]

[0, 6, 5, 4, 7, 1, 8, 3, 9, 2]
[7, 0, 2, 5, 6, 1, 4, 9, 8, 3]
[9, 2, 6, 0, 8, 1, 5, 4, 7, 3]
[4, 1, 6, 5, 0, 8, 7, 9, 2, 3]
[3, 8, 7, 0, 4, 1, 9, 5, 6, 2]


ソートアルゴリズムとかは書いたことがあるけどこういうシャッフルアルゴリズムは書いたことがないよなーと。