前几天我在同一个网站上看到了一个使用AQL从集合中查询随机文档的方法:
Randomly select a document in ArangoDB
我此刻的实施是:
//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
)
但是,当我使用这种方法时,它很难被称为“随机”。例如,在3500+文档集合中,我设法连续5次获得相同的文档,并且在25次以上的尝试过程中,可能会有3到4个文档不断返回给我。看来该方法适用于输出的特定文档。我想知道在这里还有一些改进还是在那个线程中没有提到的其他方法。问题是由于声誉级别低,我无法对该帖子发表评论,所以我不能在同一个地方提出这个问题。不过,我认为值得讨论。我希望有人可以帮助我获得更好的随机化。
答案 0 :(得分:2)
基本上,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
}
]
您可以使用各种技术来生成不会重复的伪随机数,就像使用相同的种子调用rand()
一样。
编辑:这实际上是Windows bug。如果你可以使用linux,你应该没问题。