# How to shuffle a slice in Go

Created
Modified

## Using rand.Shuffle Function

Shuffle pseudo-randomizes the order of elements using the default Source.

``````package main

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

func main() {

s := []string{"Japan", "Germany", "France"}

rand.Seed(time.Now().UnixNano())
// func Shuffle(n int, swap func(i, j int))
rand.Shuffle(len(s), func(i, j int) { s[i], s[j] = s[j], s[i] })

fmt.Printf("%q\n", s)
}``````
`["Japan" "France" "Germany"]`

Don't forget about the rand.Seed(), otherwise you got the same string every first time launch.

n is the number of elements. Shuffle panics if n < 0.

swap swaps the elements with indexes i and j.

## Using rand.Intn Function

Use the rand.Seed and rand.Intn functions in package math/rand. Fisher–Yates algorithm:

``````package main

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

func main() {

s := []string{"Japan", "Germany", "France"}

rand.Seed(time.Now().UnixNano())
for i := len(s) - 1; i > 0; i-- {
j := rand.Intn(i + 1)
s[i], s[j] = s[j], s[i]
}

fmt.Printf("%q\n", s)
}``````
`["France" "Germany" "Japan"]`

Intn returns, as an int, a non-negative pseudo-random number in [0,n)

It panics if n <= 0.