随机选择文档 ArangoDB 通常会给出相同的结果
Randomly selecting document ArangoDB often gives the same results
前几天,我在同一个网站上看到了一种使用 AQL 从集合中查询随机文档的方法:
我目前的实现是:
//brands
let b1 = (
for brand in brands
filter brand.brand == @brand1
return brand._id
)
//pick random car with brand 1
let c1 = (
for edge in edges
filter edge._from == b1[0]
for car in cars
filter car._id == edge._to
sort rand() limit 1
return car._id
)
但是,当我使用那个方法时,它很难被调用'random'。例如,在 3500 多个文档集合中,我设法连续 5 次获得相同的文档,并且在 25 次以上的尝试过程中,可能有 3 到 4 个文档不断返回给我。似乎该方法适用于正在输出的特定文档。我想知道这里是否还有一些改进或该线程中未提及的其他方法。问题是由于信誉级别低,我还不能对线程发表评论,所以我不能在同一个地方提出问题。然而,我认为它仍然值得讨论。我希望有人可以帮助我获得更好的随机化。
本质上,rand()
函数在每次查询执行时都以相同的方式播种。同一查询中的多次调用会有所不同,但下一次执行将从相同的数字开始。
我 运行 这个查询每次都看到相同的 3 个数字:
return {
"1": rand(),
"2": rand(),
"3": rand()
}
不总是,但经常得到相同的数字:
[
{
"1": 0.5635853144932401,
"2": 0.19330423902096622,
"3": 0.8087405011139256
}
]
然后,以当前毫秒为种子:
return {
"1": rand() + DATE_MILLISECOND(DATE_NOW()),
"2": rand() + DATE_MILLISECOND(DATE_NOW()),
"3": rand() + DATE_MILLISECOND(DATE_NOW())
}
现在我总是得到不同的号码。
[
{
"1": 617.8103840407173,
"2": 617.0999366056549,
"3": 617.6308832757169
}
]
您可以使用各种技术来生成不会重复的伪运行dom 数字,就像使用相同种子调用 rand()
一样。
编辑:这实际上是一个 Windows bug。如果你可以使用 linux 你应该没问题。
前几天,我在同一个网站上看到了一种使用 AQL 从集合中查询随机文档的方法:
我目前的实现是:
//brands
let b1 = (
for brand in brands
filter brand.brand == @brand1
return brand._id
)
//pick random car with brand 1
let c1 = (
for edge in edges
filter edge._from == b1[0]
for car in cars
filter car._id == edge._to
sort rand() limit 1
return car._id
)
但是,当我使用那个方法时,它很难被调用'random'。例如,在 3500 多个文档集合中,我设法连续 5 次获得相同的文档,并且在 25 次以上的尝试过程中,可能有 3 到 4 个文档不断返回给我。似乎该方法适用于正在输出的特定文档。我想知道这里是否还有一些改进或该线程中未提及的其他方法。问题是由于信誉级别低,我还不能对线程发表评论,所以我不能在同一个地方提出问题。然而,我认为它仍然值得讨论。我希望有人可以帮助我获得更好的随机化。
本质上,rand()
函数在每次查询执行时都以相同的方式播种。同一查询中的多次调用会有所不同,但下一次执行将从相同的数字开始。
我 运行 这个查询每次都看到相同的 3 个数字:
return {
"1": rand(),
"2": rand(),
"3": rand()
}
不总是,但经常得到相同的数字:
[
{
"1": 0.5635853144932401,
"2": 0.19330423902096622,
"3": 0.8087405011139256
}
]
然后,以当前毫秒为种子:
return {
"1": rand() + DATE_MILLISECOND(DATE_NOW()),
"2": rand() + DATE_MILLISECOND(DATE_NOW()),
"3": rand() + DATE_MILLISECOND(DATE_NOW())
}
现在我总是得到不同的号码。
[
{
"1": 617.8103840407173,
"2": 617.0999366056549,
"3": 617.6308832757169
}
]
您可以使用各种技术来生成不会重复的伪运行dom 数字,就像使用相同种子调用 rand()
一样。
编辑:这实际上是一个 Windows bug。如果你可以使用 linux 你应该没问题。