如何从切片中获取一些独特的随机项目

How to get some unique random items from a slice

在此代码中

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    rand.Seed(86)
    items := []string{"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg"}
    item1 := items[rand.Intn(len(items))]
    item2 := items[rand.Intn(len(items))]
    item3 := items[rand.Intn(len(items))]
    fmt.Print(item1 + " ")
    fmt.Print(item2 + " ")
    fmt.Print(item3)
    fmt.Println()
}

playground

我想从列表 items 中获取三个不同的项目。但是这种方法有时会 return 相同的数据,因为每次都是随机的

bbb ddd ddd

如何获取唯一数据并循环所有模式?

aaa bbb ccc
aaa bbb ddd
aaa bbb eee
aaa bbb fff
aaa bbb ggg
bbb ccc ddd
bbb ccc eee
bbb ccc fff
bbb ccc ggg
ccc ddd eee
ccc ddd fff
ccc ddd ggg
ddd eee fff
ddd eee ggg
eee fff ggg

解决方案

使用这个code可以得到所有的排列,但是其中一些return编辑了相同的数据,只是改变了索引。

不要在 rand 包种子上使用静态值,首先你需要阅读这个:

Seed 使用提供的种子值将默认 Source 初始化为确定性状态。如果未调用 Seed,则生成器的行为就像由 Seed(1) 播种一样。除以 2³¹-1 时具有相同余数的种子值生成相同的伪随机序列。与 Rand.Seed 方法不同,种子可以安全地同时使用。

因此当您提供初始值时,种子是静态值。

你需要做这样的事情:

rand.Seed(time.Now().UnixNano())