質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

2839閲覧

重複を最小にするチーム分

abide

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/12 13:10

メンバーリストを指定した人数で、指定した回数にランダムでチーム分けがしたいです。
その際になるべく前回、前々回とメンバーの重複が少なくなるようにしたいです。

インプットとなるメンバーリストは下記です。

Tanaka
Suzuki
Yamada
Sato
Minami
Takahashi
Matsunaga
Yasuda
Adachi
Nagata

10名を今回は3名ずつ、3回のチーム分けを繰り返したいです。

3名に分けると余りが出るので、余った場合は最後のグループを4名にします。

ランダムでこのようなことができるメソッドがあるのか、スクリプトをたくさん書かないといけないのか、全く見当がつかないためお力添えいただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ランダムでこのようなことができるメソッドがあるのか、スクリプトをたくさん書かないといけないのか

そんな個別の細かいルールに対応した便利メソッドは無いので、まずはご自身で書いてください。
ここに質問をするときも、少なくとも自分が書いたコードや調査してわかっていることを記載するようにしてください。

投稿2021/09/12 13:35

mather

総合スコア6759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

その際になるべく前回、前々回とメンバーの重複が少なくなるようにしたいです。

力まかせのコードですが参考まで

Python

1import random 2 3lst = ['Tanaka', 'Suzuki', 'Yamada', 'Sato', 'Minami', 4 'Takahashi', 'Matsunaga', 'Yasuda', 'Adachi', 'Nagata'] 5 6while True: 7 teams = [random.sample(lst, 10) for _ in range(3)] 8 group = [(team[:3], team[3:6], team[6:]) for team in teams] 9 freq = [len([t for team in group for tm in team for t in tm if name in tm]) - 2 10 - len(set([t for team in group for tm in team for t in tm if name in tm])) for name in lst] 11 if max(freq) <= 1 and freq.count(1) <= 6: 12 break 13 14print(*group, sep='\n') 15print('(名前, 重複回数) =', *zip(lst, freq))

以下、前回までの回答です。

random.sample を使うとこんな感じです。

無駄な処理をなくしました。

Python

1import random 2 3lst = ['Tanaka', 'Suzuki', ... 'Nagata'] 4teams = [random.sample(lst, 10) for _ in range(3)] 5for team in teams: 6 print(team[:3], team[3:6], team[6:])

以前のコードです。

Python

1import random 2 3lst = ['Tanaka', 'Suzuki', ... 'Nagata'] 4nums = [random.sample(range(10), 10) for _ in range(3)] 5for num in nums: 6 team0 = [lst[n] for n in num[:3]] 7 team1 = [lst[n] for n in num[3:6]] 8 team2 = [lst[n] for n in num[6:]] 9 print(team0, team1, team2)

投稿2021/09/12 13:33

編集2021/09/14 12:44
lehshell

総合スコア1156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

actorbug

2021/09/12 20:28

その回答で「その際になるべく前回、前々回とメンバーの重複が少なくなるようにしたいです。」という条件を満たせますか?
lehshell

2021/09/14 12:45

失礼しました。肝心な点に対応できていなかったですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問