如何从切片中获取一些独特的随机项目
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()
}
我想从列表 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())
在此代码中
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()
}
我想从列表 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())