从Go Slice中选择一个随机值

Ami*_*tad 35 random go slice

情况:

我有一些值,需要从中随机选择一个值.然后我想用固定的字符串连接它.到目前为止这是我的代码:

func main() {
//create the reasons slice and append reasons to it
reasons := make([]string, 0)
reasons = append(reasons,
    "Locked out",
    "Pipes broke",
    "Food poisoning",
    "Not feeling well")

message := fmt.Sprint("Gonna work from home...", pick a random reason )
}
Run Code Online (Sandbox Code Playgroud)

题:

是否有内置功能,可以通过" 选择随机原因 "部分帮助我?

Grz*_*Żur 71

使用功能,Intnrand包中选择一个随机指数.

import (
  "math/rand"
  "time"
)

// ...

rand.Seed(time.Now().Unix()) // initialize global pseudo random generator
message := fmt.Sprint("Gonna work from home...", reasons[rand.Intn(len(reasons))])
Run Code Online (Sandbox Code Playgroud)

其他解决方案是使用Rand对象.

s := rand.NewSource(time.Now().Unix())
r := rand.New(s) // initialize local pseudorandom generator 
r.Intn(len(reasons))
Run Code Online (Sandbox Code Playgroud)

  • 为了记录,rand.Seed ...也是需要的. (5认同)
  • @texnicii `rand.Intn` 的文档指定:`Intn 以 int 形式从默认源返回半开区间 [0,n) 中的非负伪随机数。` n` 表示范围不包含 n,因此如果您不想忽略其最后一个元素,则应使用 `len(reasons)` (2认同)

Ain*_*r-G 17

只需选择一个随机整数mod切片长度:

rand.Seed(time.Now().Unix())
reasons := []string{
    "Locked out",
    "Pipes broke",
    "Food poisoning",
    "Not feeling well",
}
n := rand.Int() % len(reasons)
fmt.Print("Gonna work from home...", reasons[n])
Run Code Online (Sandbox Code Playgroud)

游乐场:http://play.golang.org/p/fEHElLJrEZ.(注意推荐rand.Seed.)

  • 这不如 `rand.Intn(len(reasons))` 好。仅使用 % 不会对 [0, len(reasons)) 的每个值具有相等的概率。 (7认同)