Arrays 如何从切片中获取一些唯一的随机项
在此代码中Arrays 如何从切片中获取一些唯一的随机项,arrays,algorithm,go,unique,slice,Arrays,Algorithm,Go,Unique,Slice,在此代码中 package main import ( "fmt" "math/rand" ) func main() { rand.Seed(86) items := []string{"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg"}
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()
}
我想从列表项目中获取三个不同的项目。但这种方法有时会返回相同的数据,因为每次都是随机的
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
解决方案
使用此选项可以获得所有排列,但其中一些返回相同的数据,只是更改了索引。不要在rand软件包种子上使用静态值,首先需要阅读以下内容:
Seed使用提供的Seed值将默认源初始化为确定性状态。如果未调用Seed,则生成器的行为与Seed(1)的行为相同。当被2除以1时具有相同余数的种子值生成相同的伪随机序列。与Rand.Seed方法不同,Seed方法对于并发使用是安全的
所以,当您提供init值时,种子是静态值
您需要这样做:
rand.Seed(time.Now().UnixNano())
正确的语言可能会帮助您找到已经存在的答案:您需要切片的随机排列。然而,在你问题的最后,看起来你想要每一个排列,而你不在乎随机性。这是哪一个?此代码将返回随机项,但不能保证所有可能的排列。此外,操场上有一个固定的种子,所以它不是完全随机的。尝试使用rand.Seed
并在本地运行它。@HymnsForDisco我每次需要3个不同的数据,add要获取切片中的所有图案。这是否回答了您的问题@我在操场上更新了代码。