フィッシャー-イェーツのシャッフル
Fisher-Yates shuffle
効率的なシャッフルアルゴリズム
シャッフルの方法
配列から要素をランダムに選び、新しい配列に加える
ランダムに選ぶ方法をいい感じにしたい
シャッフルしたかを管理する
JavaScriptと違って要素の歯抜けができなかったあんも.icon
code:jl
function badshuffle(cards::Vector)
n = length(cards)
taken = falses(n) # 移し替えられたかの管理
copy = Vector{eltype(cards)}()
remaining = n
while remaining > 0
i = floor(Int, rand() * n) + 1
if !takeni
push!(copy, cardsi)
takeni = true
remaining -= 1
end
end
return copy
end
# @time badshuffle(i for i=1:10^7)
仕切りがあれば配列は1つでよい
変数の値の入れ替えで後ろに詰め込んでいく
code:jl
function fisher_yates!(cards::Vector)
for i in reverse(eachindex(cards))
j = rand(1:i)
cardsi, cardsj = cardsj, cardsi
end
return cards
end
# @time fisher_yates!(i for i=1:10^7)
https://bost.ocks.org/mike/shuffle/
実際の実装?あんも.icon
https://docs.julialang.org/en/v1/stdlib/Random/#Random.shuffle
https://github.com/JuliaLang/julia/blob/master/stdlib/Random/src/misc.jl
https://github.com/JuliaLang/julia/blob/master/stdlib/Random/src/misc.jl#L227