同一列表中的多个随机元素

时间:2018-05-09 17:39:31

标签: go

我想在同一时间从列表中获取多个随机元素,但不需要每次都是相同的元素。

第二个问题是:我想从列表中获取uniq元素,例如,如果我得到08,则需要从列表中删除此代码并获取net随机排除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

每次都返回相同的输出,我想随机而独特

1 个答案:

答案 0 :(得分:0)

要获得唯一答案,您只需从切片中删除现有答案即可。我已经敲了一些东西,使用一个函数。有更有效的方法可以做到这一点,但这很容易看出发生了什么。

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
}