【问题标题】:multiple random element from list in same time同时从列表中获取多个随机元素
【发布时间】:2018-10-19 21:54:53
【问题描述】:

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

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

每次都返回相同的输出,我希望是随机且独特的

【问题讨论】:

  • 每次运行都不一样,除非time.Now()每次运行都一样。
  • 请注意,在一秒钟内运行多次将产生相同的结果,因为time.Now().Unix() 是以整秒为单位测量的。如果您想要更细粒度的时间戳,请使用UnixNano()
  • @JimB 在我的电脑里返回 09 09 09, ---- 01 01 01
  • @StefanoConte:这与您在问题中所说的不同,它是 3 个不同的索引,但后续运行的结果相同。它是哪一个? 09、09、09 不太可能,但仍有可能。那是你正在执行的确切代码吗?

标签: go


【解决方案1】:

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

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
}

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多