我正在尝试为两组人进行国际象棋比赛。我必须随机从每个小组中挑选一名成员并进行游戏。根据每个小组的胜利数量,我将决定哪个小组更有才华。
让我们说,Group1和Group2。 Group1包含40个人,Group2包含30个人。现在,我必须挑选两个人,每个人来自一个小组并进行游戏。
Game1 : P1G1----vs----P4G2
Game2 : P23G1----vs----P1G2
Game3 : P12G1----vs----P15G2
....
....
....
Game30: P36G1----vsP30G2
如何使用neo4j获得这些随机组合。基本上,我怎样才能避免使用Cartis产品。
随机选择(由@Micheal Hunger提供)
MATCH (n) WITH count(*) as total
WITH [_ IN range(1,10000) | toInt(rand()*total)] as ids
MATCH (per) WHERE id(per) IN ids AND emp:Group1
RETURN per
如何从每个组中获取随机组合?
答案 0 :(得分:3)
APOC Procedures刚刚更新了一些可能有帮助的collection functions(确保您获得了Neo4j版本的正确APOC版本)
至少需要Neo4j 3.1.x和最新版本的APOC。
参见apoc.coll.randomItem()和apoc.coll.randomItems()。
有几种方法可以使用这些来解决您的问题,具体取决于所有玩家是否必须参与至少一个游戏,但这里有一个例子:
如果你不需要每个玩家参与游戏,你只需要30个游戏,你可以使用这些功能的组合来获得你的对战。
MATCH (g1:Group1)
WITH COLLECT(g1) as g1
MATCH (g2:Group2)
WITH g1, COLLECT(g2) as g2
UNWIND apoc.coll.randomItems(g1, 30) as group1
WITH group1, apoc.coll.randomItem(g2) as group2
RETURN group1, group2
答案 1 :(得分:1)
如果群组中的人数很少(例如,最多1000个),则可以按随机排序并限制:
MATCH (A:Group1),(B:Group2)
WHERE A <> B
RETURN A, B
ORDER BY RAND()
LIMIT 30