随机选择文档 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 你应该没问题。