Random 随机选择ArangoDB文档通常会得到相同的结果

Random 随机选择ArangoDB文档通常会得到相同的结果,random,arangodb,Random,Arangodb,前几天,我在同一个网站上看到了一种使用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

前几天,我在同一个网站上看到了一种使用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
)
然而,当我使用这种方法时,它很难被称为“随机”。例如,在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
  }
]
您可以使用各种技术生成不会重复的伪随机数,就像使用相同的种子调用
rand()


编辑:这实际上是一个问题。如果你能使用linux,那就没问题。

你想要随机获取文档的目的是什么?你想在网站上显示一辆随机的汽车作为“推荐”/用户当前选择的替代品吗?除了您需要的统一分发之外,还有其他属性吗?您好@CoDEmanX,谢谢您的提问!这基本上是猜谜游戏的一部分。假设它就像一个随机模型被展示给最终用户,这个人必须猜测正确的制造商。因此,为了使游戏不过时,随机性是非常重要的。无论如何,上面的代码只是一个例子,实际上,内容目前并不相关。我明白了。对于这样的猜谜游戏,不希望在单个游戏中为特定用户重复汽车,或者甚至在该用户的整个游戏中重复汽车吗?还有一个技术问题:您是否使用RocksDB作为存储引擎?这当然是需要考虑的问题,但到目前为止,我只关心是否有一种可行的方法来实现任何随机性,特别是因为稍后还会有其他几个随机参数。所有这些都表现出相同的行为,但我确信我想有一些重复。我目前没有使用RocksDB no.
rand()
真的需要一颗种子。我在github上发布了一个问题: