如何在Golang中随机播放数组中的字符串?

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], "
")
    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?

douxuan1284
douxuan1284 Go中shuffle数组的可能重复项
大约 3 年之前 回复
donglu6805
donglu6805 Go中MongoDB查询的Randomize顺序的可能重复项。
大约 3 年之前 回复
dongyunshan4066
dongyunshan4066 stackoverflow.com/questions/12264789/shuffle-array-in-go
大约 3 年之前 回复

3个回答

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
", 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:

  1. Create a second array (randomArray) of touples, containing a random number and element position in isArray.
  2. Sort this array by the random number
  3. Create a new array, copying elements of isArray, but ordered by our randomArray
dpxnrx11199
dpxnrx11199 rand是一个伪随机数生成器-给定一个起始数字,算法将生成其他随机出现的数字(很难猜测下一个数字)。 因为它是一种算法,所以如果您以相同的编号(种子)开头,则下一个始终是相同的。 因此,您需要在首次使用前播种
大约 3 年之前 回复
duanmei1536
duanmei1536 所以我尝试将其实现为我的真实代码(用户定义),并且可以手动操作,它可以将字符串随机播放。谢谢@ denis.lobanov
大约 3 年之前 回复
doulu2029
doulu2029 您能解释一下为什么需要在rand.Intn()之前添加它吗?
大约 3 年之前 回复
dongre1907
dongre1907 哇哇哇; 我刚刚添加了它,它的工作原理是:-),谢谢
大约 3 年之前 回复
drahywu329376
drahywu329376 不,我没有为什么
大约 3 年之前 回复
duanguan1573
duanguan1573 您是否在rand.Intn()之前调用了rand.Seed(time.Now()。UTC()。UnixNano())之类的名称? 否则,它将始终生成相同的数字:5
大约 3 年之前 回复
duananyu9231
duananyu9231 我考虑过使用您的第一个示例,但它不起作用。每次我运行代码时,它始终显示“ Left 4 Dead”。 PS(我将rand.Intn(10)的值更改为rand.Intn(9),因为数组从0开始。
大约 3 年之前 回复



 包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]
}
返回最终值
}
</ code> </ pre>
</ div>

展开原文

原文

 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
 }

dongmu7335
dongmu7335 一个小窍门,UnixNano返回一个UTC时间值,因此种子中实际上不需要.UTC()。
2 年多之前 回复



 包main 

import(
“ fmt”
“数学/ rand”
“时间” \ n)

类型列表[] string

func main(){

s:= list {
“ Tanki”,
“左4死者”,
“火箭联盟”,
“ 使命召唤: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:=范围l {
n:= r.Intn(len(l)-1)
l [i],l [n] = l [n],l [ i]
}
返回l
}
</ code> </ pre>
</ div>

展开原文

原文

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
}

dongtang6718
dongtang6718 欢迎使用stackoverflow。 请充分说明您的答案。 仅仅发布代码并不能帮助其他用户理解您的答案。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐