1

我正在尝试将球员分配到一个俱乐部。一个俱乐部有 n 名球员,一名球员属于一个俱乐部。一个俱乐部只能有少于 23 名球员,并且不能超过 2 名球员在同一位置上比赛。

clubs = Club.all #Club is a datamapper object. Returns 20 clubs
to_generate = 10000
while (to_generate > 0)
  p = Player.new #Player is a datamapper object
  p.position = position #position is a random integer defined elsewhere

  clubs.each do |club|
    count = 0
    club.players.each do |club_player|
      if (club_player.position == p.position)
        count += 1
      end
    end
    if (count < 2 && club.players.length < 22)
      club.players << p
      p.club = club
    end
  end
  p.save
  to_generate -= 1

结尾

在脚本的最后,我预计所有俱乐部都有 22 名球员。为什么不是这样?

编辑:在脚本结束时,我只得到了 22 名球员分配到最后一个俱乐部(20 名),并生成了 10000 名球员

4

1 回答 1

0

问题 1:您可以超过每支球队和每个位置的最大球员人数

这些行

if (count < 3 && club.players.length < 23)
  club.players << p
  p.club = club
end

可以概括为“如果俱乐部的球员少于 23 人,并且该位置的球员少于 3 人,您可以将球员添加到俱乐部。”

这意味着它允许您再添加一个...总共为该位置提供 3 个,为团队提供 23 个。所以这部分逻辑是错误的。相反,你想要

if (count < 2 && club.players.length < 22)

问题 2:随机数可能无法保证您拥有正确的玩家类型

如果位置是随机生成的,您无法确定是否有足够的正确类型的玩家。例如,如果随机数巧合地总是 2 怎么办?你永远不会拥有一个完整的团队。

问题3:一旦分配了一名球员,你就继续尝试其他俱乐部

一旦你分配了一名球员,你就不应该再看任何俱乐部了。为此,您需要突破each障碍。

if (count < 3 && club.players.length < 23)
  club.players << p
  p.club = club
  break
end

即使您club.players << p为同一个玩家调用了很多次,DataMapper 也知道您的一对一关联并且最后一个分配“获胜”。

于 2011-11-04T16:28:32.003 回答