2011-11-04 2 views
1

나는 선수를 클럽에 할당하려고합니다. 클럽에는 n 명의 플레이어가 있고 플레이어는 클럽에 속해 있습니다. 클럽은 23 명 미만의 플레이어와 2 명 이상의 플레이어 만 같은 위치에서 플레이 할 수 있습니다.datamapper를 사용하는 객체 연결

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)와 10,000 플레이어를 얻을

+0

각 클럽에는 대본이 끝날 때 몇 명의 선수가 있습니까? – Larsenal

+0

나는 그 질문을 편집했다. 대본이 끝나면 마지막 클럽 (20 명)에 22 명의 플레이어 만 배정되고 10000 명의 플레이어가 생성됩니다 – marcosdsanchez

+0

나는 좋은 대답을 얻었습니다. – Larsenal

답변

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 블록에서 탈출해야합니다. 같은 플레이어 배의 무리 club.players << p를 호출해도

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

는 DataMapper는 one-to-one 연관 마지막 과제의 인식 "승리."

+0

문제 1 : 확인! 문제 2 : 10000 명의 플레이어를 생성하고 있습니다. 쉬운 방법이 없습니다. – marcosdsanchez

+0

감사합니다. 솔루션 3이 작동했습니다. – marcosdsanchez

+0

문제 2와 관련해서는 그렇지 않을 수도 있습니다. 그러나 결정 론적 행동을하는 것이 좋습니다. 따라서 문제가 발생했을 때 10,000 회 반복을 반복하는 대신, 각 팀에 필요한 22 명의 플레이어가 있는지 여부를 확인하기 위해 while 루프를 만들 수 있습니다. – Larsenal