Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 同时从列表中选择多个随机元素_Go - Fatal编程技术网

Go 同时从列表中选择多个随机元素

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

我想同时从列表中获得多个随机元素,但需要是真正的随机元素,而不是每次都是相同的元素

第二个问题是:我想从列表中获取uniq元素,例如,如果我获取08,则需要从列表中删除此代码并获取net random exclude 08字符串

这是我的实际代码:

    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不太可能,但仍然有可能。这就是你正在执行的代码吗?