次のPythonコードをGoに翻訳しようとしました
import random
list = [i for i in range(1, 25)]
random.shuffle(list)
print(list)
しかし、シャッフル関数がなく、インターフェイスを実装して型を変換する必要があったため、Goバージョンは長くて扱いにくいことがわかりました。
私のコードの慣用的なGoバージョンは何でしょうか?
dystroyの答えは完全に合理的ですが、追加のスライスを割り当てずにシャッフルすることも可能です。
for i := range slice {
j := rand.Intn(i + 1)
slice[i], slice[j] = slice[j], slice[i]
}
アルゴリズムの詳細については、このWikipediaの記事を参照してください。rand.Perm
実際には、このアルゴリズムも内部で使用しています。
リストは1から25までの整数なので、Permを使用できます。
list := rand.Perm(25)
for i, _ := range list {
list[i]++
}
によって与えられる順列を使用することrand.Perm
は、任意の配列をシャッフルするための効果的な方法であることに注意してください。
dest := make([]int, len(src))
perm := rand.Perm(len(src))
for i, v := range perm {
dest[v] = src[i]
}