gpt4 book ai didi

mongodb - 在 Go 中随机化 MongoDB 查询的顺序

转载 作者:IT王子 更新时间:2023-10-29 02:12:11 25 4
gpt4 key购买 nike

这是我的查询:

c := session.DB("searchV").C("video")
var results []BadVideo
err5 := c.Find(nil).All(&results)
fmt.Println("request done")
if err5 != nil {
panic(err5)
}
var i = 0
for _,badvideo := range results {
}

我想随机化浏览查询项目的顺序,以便对请求的每个项目进行操作......

所以每次我运行它时,我都会以不同的顺序浏览它。

最佳答案

手动洗牌

这是一个简单的随机播放算法,它随机播放(随机化)一个 []BadVido slice :

func shuffle(r []BadVideo) {
for i := len(r) - 1; i > 0; i-- {
j := rand.Intn(i + 1)
r[i], r[j] = r[j], r[i]
}
}

因此,在加载结果后,只需对其调用 shuffle(results)

为了测试,我将使用一个简单的 BadVideo 类型:

type BadVideo struct {
Name string
}

func main() {
rand.Seed(time.Now().UnixNano())
results := []BadVideo{{"a"}, {"b"}, {"c"}, {"d"}, {"e"}}
shuffle(results)
fmt.Println(results)
}

输出(在 Go Playground 上尝试):

[{c} {d} {b} {e} {a}]

工作原理:

为了打乱 slice ,shuffle() 函数从 slice 中为每个索引随机选择一个元素。它就像向下迭代所有元素,并从剩余的 slice 中选择一个随机元素(包括我们当前选择的元素的索引,因为随机顺序也包括元素“留在原地”的元素),并使用随机索引将元素与所选的随机元素交换。循环一直进行到 i > 0(而不是直到 i >=0),因为如果只剩下 1 个元素,则不需要将其与自身交换。

使用rand.Perm()

shuffle() 的另一种变体可以利用 rand.Perm()它返回一个包含随机数字的 slice 。我们可以使用这些随机数来告诉如何重新排序结果:

func shuffle(r []BadVideo) {
r2 := append([]BadVideo(nil), r...)
for i, j := range rand.Perm(len(r)) {
r[i] = r2[j]
}
}

Go Playground 上尝试这个变体.

这里需要注意一点:在重新排序之前,我们必须保存原始 slice (复制它),因此我们可以在将结果写入 slice 时选择随机索引指定的原始元素。我通过将完整 slice 附加到 nil slice 来创建副本。

关于mongodb - 在 Go 中随机化 MongoDB 查询的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43157290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com