首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在golang中对数组中的字符串进行洗牌?

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

Stack Overflow用户
提问于 2017-05-17 13:50:38
回答 4查看 3.7K关注 0票数 2

所以我创建了一个程序来帮助我决定玩哪一种游戏。在我开始我的问题之前,让我向您展示我的代码:

代码语言:javascript
复制
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)
}

所以当我已经知道哪个号码会触发一个游戏时,问题就开始了,如果我使用它两次的话。所以我试着把字符串随机化,就像每次我使用它的时候,我怎么做呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-17 14:31:38

那么,对于您的问题,为什么不使用rand.Intn()选择一个随机数和打印游戏,而不是让用户选择一个数字?

代码语言:javascript
复制
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])

但是,如果您想要为数组中的字符串洗牌,那么您可以这样做:

代码语言:javascript
复制
// 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. 创建一个新数组,复制isArray的元素,但由randomArray命令
票数 0
EN

Stack Overflow用户

发布于 2017-09-08 10:24:13

代码语言:javascript
复制
 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
 }
票数 2
EN

Stack Overflow用户

发布于 2018-12-09 18:53:33

代码语言:javascript
复制
package main

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

type list []string

func main() {

    s := list{
        "Tanki",
        "Left 4 Dead",
        "Rocket League",
        "Call Of Duty : AW",
    }
    s.shuffle()
    s.print()
}

func (l list) print() {
    for i, v := range l {
        fmt.Println(i, v)
    }
}

func (l list) shuffle() list {
    src := rand.NewSource(time.Now().UnixNano())
    r := rand.New(src)
    for i := range l {
        n := r.Intn(len(l) - 1)
        l[i], l[n] = l[n], l[i]
    }
    return l
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44026823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档