1

我有一个看起来像这样的集合:

[
  {
    "id": 1,
    "tier": 0
  },
  {
    "id": 2,
    "tier": 1
  },
  {
    "id": 3
    "tier": 2
  },
  {
    "id": 4,
    "tier": 0
  }
]

有没有一种标准的方法来选择n 个元素,其中选择最低层元素的概率是p,下一个最低层是 (1- p )* p,依此类推,标准随机选择元素?

因此,例如,如果最有可能发生的事情发生并且我使用n = 2 和任何p > .5对上述示例运行查询(我认为这将永远是正确的),那么我会回来[{"id": 1, ...}, {"id": 4}]n = 3,则等[{"id": 4}, {"id": 1}, {"id": 2}]

例如,这里有一些伪 Python 代码,给定一个像objs这样的字典:

def f(objs, p, n):
  # get eligible tiers
  tiers_set = set()
  for o in objs:
    eligible_tiers.add(o["tier"])
  tiers_list = sorted(list(tiers_set))
  # get the tier for each index of results
  tiers = []
  while len(tiers) < min(n, len(obis)):
    tiers.append(select_random_with_initial_p(eligible_tiers, p))
  # get res
  res = []
  for tier in tiers:
    res.append(select_standard_random_in_tier(objs, tier)
  return res
4

1 回答 1

0

首先,对集合启用地理空间索引:

db.docs.ensureIndex( { random_point: '2d' } )

要创建一堆在 X 轴上具有随机点的文档:

for ( i = 0; i < 10; ++i ) {
    db.docs.insert( { key: i, random_point: [Math.random(), 0] } );
}

然后你可以像这样从集合中获取一个随机文档:

db.docs.findOne( { random_point : { $near : [Math.random(), 0] } } )

或者您可以检索几个最接近随机点的文档:

db.docs.find( { random_point : { $near : [Math.random(), 0] } } ).limit( 4 )

这只需要一次查询,不需要空检查,而且代码干净、简单、灵活。您甚至可以使用地理点的 Y 轴为您的查询添加第二个随机维度。

要进行自定义随机选择,您可以更改该部分[Math.random(), 0],使其最适合您的随机分布

来源:来自 MongoDB 的随机记录

于 2015-09-12T12:12:31.147 回答