Issue
So I created a program to help me decide which game to play. Before I start my problem let me show you my code:
package main
import (
"fmt"
"strconv"
"time"
)
func main() {
isArray := [10]string{"Paladins", "Overwatch", "CS:GO", "Tanki", "Left 4 Dead", "Rocket League", "Call Of Duty : AW", "Portal", "Star Citizen", "Star Wars : Battlefront"}
fmt.Print("0,1,2,3,4,5,6,7,8,9 := ")
var (
va string
ar string
)
fmt.Scanln(&va)
i, _ := strconv.Atoi(va)
fmt.Print("You Should Play : ")
fmt.Print(isArray[i], "\n")
fmt.Print("[Y/N] := ")
fmt.Scanln(&ar)
if ar != "N" || ar != "n" {
fmt.Print("OK")
}
time.Sleep(3 * time.Second)
}
So the problems start when I already know which number would trigger a game, if I use it twice. So I am trying to make the strings random, like shuffling each time I use it, how can I do that?
Solution
Well, literally for your problem why not use rand.Intn()
to choose a random number and print the game rather than make the user pick a number?
isArray := [10]string{"Paladins", "Overwatch", "CS:GO", "Tanki", "Left 4 Dead", "Rocket League", "Call Of Duty : AW", "Portal", "Star Citizen", "Star Wars : Battlefront"}
n := rand.Intn(9)
fmt.Printf("You Should Play : %s\n", isArray[n])
But if you want to shuffle strings in an array for the sake of it, then you can do it in place like this:
// Shuffle array in place
l := len(isArray)-1
for i := 0; i <=l; i++ {
n := rand.Intn(l)
// swap
x := isArray[i]
isArray[i] = isArray[n]
isArray[n] = x
}
This should be O(n), though I’m not sure about the complexity of Intn
. If you really want to be fancy, you could:
- Create a second array (
randomArray
) of touples, containing a random number and element position inisArray
. - Sort this array by the random number
- Create a new array, copying elements of
isArray
, but ordered by ourrandomArray
Answered By – denis.lobanov
Answer Checked By – Marie Seifert (GoLangFix Admin)