Go 同时从列表中选择多个随机元素
我想同时从列表中获得多个随机元素,但需要是真正的随机元素,而不是每次都是相同的元素 第二个问题是:我想从列表中获取uniq元素,例如,如果我获取08,则需要从列表中删除此代码并获取net random exclude 08字符串 这是我的实际代码:Go 同时从列表中选择多个随机元素,go,Go,我想同时从列表中获得多个随机元素,但需要是真正的随机元素,而不是每次都是相同的元素 第二个问题是:我想从列表中获取uniq元素,例如,如果我获取08,则需要从列表中删除此代码并获取net random exclude 08字符串 这是我的实际代码: package main import ( "fmt" "math/rand" "time" ) func main() { // Won't work on the Playground since th
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
// Won't work on the Playground since the time is frozen.
rand.Seed(time.Now().Unix())
reasons := []string{
"01","02","03","04", "05", "06", "07", "08", "09", "10",
}
n := rand.Int() % len(reasons)
n1 := rand.Int() % len(reasons)
n2 := rand.Int() % len(reasons)
fmt.Println("", reasons[n])
fmt.Println("", reasons[n1])
fmt.Println("", reasons[n2])
}
我的输出是:
07
02
06
每次返回相同的输出时,我都希望是随机且唯一的要获得唯一的答案,您所要做的就是从切片中删除现有答案。我用一个函数拼凑了一些东西。有更有效的方法可以做到这一点,但这很容易看出发生了什么
func main() {
rand.Seed(time.Now().Unix())
reasons := []string{
"01", "02", "03", "04", "05", "06", "07", "08", "09", "10",
}
n, reasons := getRandom(reasons)
n1, reasons := getRandom(reasons)
n2, reasons := getRandom(reasons)
fmt.Println("", n)
fmt.Println("", n1)
fmt.Println("", n2)
}
func getRandom(reasons []string) (string, []string) {
n := rand.Int() % len(reasons)
switch n {
case 0:
return reasons[0], reasons[1:]
case len(reasons) - 1:
return reasons[n], reasons[:n]
}
newSlice := []string{}
for i, item := range reasons {
if i != n {
newSlice = append(newSlice, item)
}
}
return reasons[n], newSlice
}
它每次都不同,除非每次运行时
time.Now()
都是相同的。请注意,在一秒钟内多次运行它将产生相同的结果,因为time.Now().Unix()
是以整秒为单位测量的。如果您想要更细粒度的时间戳,请在我的计算机中使用UnixNano()
@JimB返回09,---0101@StefanoConte:这与您在问题中所陈述的不同,问题中有3个不同的索引,但后续运行的结果相同。是哪一个?09,09,09不太可能,但仍然有可能。这就是你正在执行的代码吗?