93

次のPythonコードをGoに翻訳しようとしました

import random

list = [i for i in range(1, 25)]
random.shuffle(list)
print(list)

しかし、シャッフル関数がなく、インターフェイスを実装して型を変換する必要があったため、Goバージョンは長くて扱いにくいことがわかりました。

私のコードの慣用的なGoバージョンは何でしょうか?

4

8 に答える 8

108

dystroyの答えは完全に合理的ですが、追加のスライスを割り当てずにシャッフルすることも可能です。

for i := range slice {
    j := rand.Intn(i + 1)
    slice[i], slice[j] = slice[j], slice[i]
}

アルゴリズムの詳細については、このWikipediaの記事を参照してください。rand.Perm実際には、このアルゴリズムも内部で使用しています。

于 2012-09-04T16:12:38.940 に答える
99

リストは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]
}
于 2012-09-04T13:48:36.120 に答える