2012-03-28 4 views
4

私はrandom.shuffleを追加する場合、私は(..同じスケジュールにあなたがそれを実行するたびに発生し、次のPythonのランダムなスポーツスケジュールジェネレータ

Generating natural schedule for a sports league

を発見した)そこにそれはまだあまりにも予測可能です。以下は

は、代わりにランダムでそのポストから私の簡単な編集であり、私は結果を見..

import random 

def round_robin(units, sets = None): 
    """ Generates a schedule of "fair" pairings from a list of units """ 
    count = len(units) 
    sets = sets or (count - 1) 
    half = count/2 

    for turn in range(sets): 
     left = units[:half] 
     right = units[count - half - 1 + 1:][::-1] 
     pairings = zip(left, right) 
     if turn % 2 == 1: 
      pairings = [(y, x) for (x, y) in pairings] 
     units.insert(1, units.pop()) 

     yield pairings 


teams = range(5) 
random.shuffle(teams) 
schedule = list(round_robin(teams, sets = len(teams) * 2 - 2)) 

for week in schedule: 
    for game in week: 
     if 0 in game: 
      print game 

は、時にはチームもお互いに再生されませんようだ奇妙な結果を得る

(0, 4) 
(4, 0) 
(0, 2) 
(0, 4) 
(4, 0) 
(0, 2) 

私の質問は、私はPythonでランダムなスケジュール発電を行うか、私がすでに持っているもの修正することができますどのように...です。

はかなり私は4つのチームを取ると、彼らは一度お互いをプレイ遊びの3週間で出てくる必要があります。それとも遊びの5週間のある5つのチームが好きで、それらはすべて、一度お互いを演じるが、1つのチームが、私は、各チームが他のチームでプレーする必要があることを想定しています週

+0

私が問題だかわからないんだけど。 – Trufa

+0

申し訳ありません...下 – Mike

答えて

4

ごとに取り残されています。そうじゃない?それでは、この質問は単純な順列になってから結果をシャッフルしないのですか?

import itertools 
import random 
set_size = 2 
schedule = set() 
teams = range(5) 
for comb in itertools.product(teams, repeat=set_size): 
    comb = sorted(list(comb)) 
    if len(set(comb)) == set_size: 
     schedule.add(tuple(comb)) 

schedule = list(schedule) 
random.shuffle(schedule) 
print schedule 
+0

これに追加質問には正しい答えではありません。あなたはまだ同じチームが2回以上連続してプレイすることになるかもしれません。しかし、各チームは1回のプレイイベント(OPの例では週)に1回しかプレイできません。したがって、スケジュールは毎週、各チームが最大で1回しか行われないイベントのリストを生成する必要があります。 – Scrontch

関連する問題