我有一个看起来像这样的集合:
[
{
"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}]
等。
E.g。这里有一些伪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
答案 0 :(得分: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 )
这只需要一个查询而不需要空检查,而且代码干净,简单且灵活。您甚至可以使用geopoint的Y轴为查询添加第二个随机性维度。
要进行自定义随机选择,您可以更改该部分[Math.random(), 0]
,以便最适合您的随机分布