Go 언어 슬라이스 섞기 Shuffle

고(Golang)에서 slice를 랜덤으로 섞는 방법.

golang

4/11/2024

Go 언어에서 math/rand/v2 스탠다드 라이브러리 패키지를 사용하는 간단한 랜덤 셔플 방법입니다.

v1에서는 실행할 때마다 동일한 결과가 산출되어서 시드(seed)를 별도로 설정해야 했는데, v2에서는 시드를 설정하지 않고 필요한 함수만 써도 실행할 때마다 다른 결과가 산출됩니다.

그러나 Go Standard Library 문서에 따르면 이 패키지에서 나오는 랜덤 결과는 시드 방식에 관계없이 쉽게 예측 가능할 수 있으니, 보안이 민감한 작업에 적합한 랜덤 값 생성은 crypto/rand 패키지를 참고하라고 합니다.


math 라이브러리 rand.Shuffle 함수


package main

import (
	"fmt"
	"math/rand/v2"
)

func main() {

	letters := []string{"a", "b", "c", "d", "e", "f", "g"}

	fmt.Println(letters)

	rand.Shuffle(len(letters), func(i, j int) {
		letters[i], letters[j] = letters[j], letters[i]
	})

	fmt.Println(letters)
}

[a b c d e f g]
[g b e d a c f] // 이 결과는 랜덤이므로 다르게 나올 수 있습니다.

rand.Shuffle 함수의 첫 번째 인자로는 대상 슬라이스의 길이 len 값을 넣어주고, 두 번째 인자로는 셔플의 원리라고 할 수 있는 함수를 넣어줍니다. rand.Shuffle 함수는 사실상 슬라이스 길이보다 적은 랜덤 숫자(int)들을 생성해 원리 함수를 반복하여 셔플을 수행할 것입니다.