どうも、ちょげ(@chogetarou)です。
スライス(Slice)の要素をシャッフルしてランダムに並び替える方法を紹介します。
方法

スライス(Slice)の要素をシャッフルしてランダムに並び替える方法は、2つあります。
rand.Shuffle()
ひとつは、「rand.Shuffle()」を使う方法です。
まず、「math/rand」をインポートします。
import "math/rand"
次に、randからShuffle()を呼び出します。
Shuffle()の第1引数にスライス(Slice)の要素数、第2引数に整数の2つの引数を持つ関数を指定します。
そして、関数の処理で、スライス(Slice)の関数の第1引数と第2引数のインデックスの要素を入れ替えます。
//slice=対象のスライス
rand.Shuffle(len(slice), func(i, j int) {
slice[i], slice[j] = slice[j], slice[i] //スライスの要素を入れ替える
})
上記のrand.Shuffle()は、要素を入れ替えたスライス(Slice)をシャッフルします。
使用例
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
numbers := []string{"one", "two", "three", "four", "five"}
rand.Seed(time.Now().UnixNano()) //乱数のシード設定
rand.Shuffle(len(numbers), func(i, j int) {
numbers[i], numbers[j] = numbers[j], numbers[i]
})
fmt.Println(numbers)
}
出力:
[four one two five three]
for文
もうひとつは、for文を使う方法です。
まず、「math/rand」をインポートします。
import "math/rand"
次に、for文をスライス(Slice)の要素数でループします。
ループ処理で、rand.Intn()を使ってランダムなインデックスを生成し、スライス(Slice)のランダムなインデックスとループ変数のインデックスの要素を入れ替えます。
//slice=対象のスライス
for i := len(slice) - 1; i > 0; i-- {
j := rand.Intn(i + 1) //乱数の生成
slice[i], slice[j] = slice[j], slice[i] //ランダムな要素の入れ替え
}
上記のfor文は、対象のスライス(Slice)をシャッフルします。
使用例
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
numbers := []string{"one", "two", "three", "four", "five"}
rand.Seed(time.Now().UnixNano()) //乱数のシード設定
//フィッシャー・イェーツのシャッフル
for i := len(numbers) - 1; i > 0; i-- {
j := rand.Intn(i + 1)
numbers[i], numbers[j] = numbers[j], numbers[i]
}
fmt.Println(numbers)
}
出力:
[one five three four two]
まとめ
スライス(Slice)の要素をシャッフルしてランダムに並び替える方法は、次の2つです。
- rand.Shuffle()を使う方法
rand.Shuffle(len(slice), func(i, j int) { slice[i], slice[j] = slice[j], slice[i] })
- for文を使う方法
コメント