如何在golang中对数组中的字符串进行洗牌?

时间:2017-05-17 13:50:39

标签: arrays string go random

所以我创建了一个程序来帮助我决定要玩哪个游戏。在开始我的问题之前,让我告诉你我的代码:

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)
}

所以当我已经知道哪个号码会触发游戏时,问题就开始了,如果我使用它两次。所以我试图让字符串随机,就像我每次使用它时一样,我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

 package main

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

 func shuffle(src []string) []string {
         final := make([]string, len(src))
         rand.Seed(time.Now().UTC().UnixNano())
         perm := rand.Perm(len(src))

         for i, v := range perm {
                 final[v] = src[i]
         }
         return final
 }

答案 1 :(得分:0)

嗯,从字面上看你的问题为什么不用rand.Intn()选择随机数并打印游戏而不是让用户选择一个数字?

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])

但是如果你想为了它而在数组中重排字符串,那么你就可以这样做:

// 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
}

这应该是O(n),尽管我不确定Intn的复杂性。如果你真的想要花哨,你可以:

  1. 创建第二个数组(randomArray),包含isArray中的随机数和元素位置。
  2. 按随机数
  3. 对此数组进行排序
  4. 创建一个新数组,复制isArray的元素,但由randomArray
  5. 排序

答案 2 :(得分:0)

-Dapplicationame.some.properties.vmarg=PathToProperties