1

次のようなコレクションがあります。

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

最下層の要素を選択する確率がp、次の最下層が (1- p ) * pなどである要素を標準的なランダム選択で選択する標準的な方法はありますか?

したがって、たとえば、最も可能性の高いことが起こり、 n = 2 および任意のp > .5を使用して上記の例に対してクエリを実行すると(これは常に true になると思います)、返され[{"id": 1, ...}, {"id": 4}]ます。n = 3 の場合、[{"id": 4}, {"id": 1}, {"id": 2}]など。

たとえば、 objsとしてそのような辞書が与えられた疑似 Python コードは次のとおりです。

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 )

これには 1 つのクエリのみが必要で、null チェックは必要ありません。また、コードはクリーンでシンプルかつ柔軟です。ジオポイントの Y 軸を使用して、2 つ目のランダム性ディメンションをクエリに追加することもできます。

カスタムのランダム選択を行うには、その部分を変更して[Math.random(), 0]、ランダム分布に最も適したものにすることができます

出典: MongoDB からのランダム レコード

于 2015-09-12T12:12:31.147 に答える