乱数をクラスのリストに組み込む方法
解決したいこと
乱数を使用して、'A','B','C'や整数を発生させ(重複を避ける)、それを組み込みたいです。
以下のソースコードはGMO Internet Group グループ研究開発本部さんの記事「【ノーベル賞×実務】pythonで簡単配属分け【ゲーム理論】」( https://recruit.gmo.jp/engineer/jisedai/blog/daalgorithm/ )から引用させていただいたものになります。
申し訳ないのですが、本当に知識がないので重複なしで乱数を発生させる方法や、文字列からランダムに抽出する方法などは調べてわかったのですが、それを組み込む方法がわかりません。
該当するソースコードののちに組み込みたい箇所を明記します。
該当するソースコード
class BrandNew:
def __init__(self, preference:list):
self.preference = preference
def pop_preference(self):
if len(self.preference) == 0: return None
return self.preference.pop(0)
from functools import cmp_to_key
class Department:
def __init__(self, preference: list, capacity:int):
self.preference: list = preference
self.capacity: int = capacity
self.__this_step_applicants: list = [] # 今回ステップの応募者
self.__keep_members: list = [] # 現在の仮決定者
def _compare_bn(self, arg1, arg2):
l_index = self.preference.index(arg1)
r_index = self.preference.index(arg2)
return l_index - r_index
@property
def keep_members(self):
return self.__keep_members
@property
def this_step_applicant(self):
return self.__this_step_applicants
@this_step_applicant.setter
def this_step_applicant(self, value):
# 新しい応募者を設定
self.__this_step_applicant = value
# 現在の仮決定者と応募者をあわせて、仮決定者を再選する
self.__keep_members = sorted(self.__keep_members + self.__this_step_applicant, key=cmp_to_key(self._compare_bn))[:self.capacity]
brand_news = {
1: BrandNew(['A', 'B', 'C']),
2: BrandNew(['A', 'B', 'C']),
3: BrandNew(['B', 'A', 'C']),
4: BrandNew(['B', 'A', 'C']),
5: BrandNew(['A', 'C', 'B']),
6: BrandNew(['C', 'A', 'B']),
7: BrandNew(['A', 'B', 'C']),
8: BrandNew(['B', 'A', 'C']),
}
departments = {
'A': Department([1, 2, 4, 8, 3, 6, 7, 5], 2),
'B': Department([1, 7, 4, 5, 3, 2, 8, 6], 2),
'C': Department([5, 6, 7, 8, 1, 2, 3, 4], 4),
}
def not_keeped_applicatns(brand_news, departments):
## 新人全員をリストアップ
all_applicants = set(brand_news.keys())
## 仮決定している人間をリストアップ
all_keeps = [x.keep_members for x in departments.values()]
all_keeps = set(chain.from_iterable(all_keeps))
## 差分を取り、今回処理対象者を決定
return all_applicants - all_keeps
# 全て配属されるまで実行
while len(xs := not_keeped_applicatns(brand_news, departments)) > 0:
# 仮決定されてない応募者を処理対象者とする
for x in xs:
target_dpts = brand_news[x].pop_preference()
departments[target_dpts].this_step_applicant = [x]
print(departments['A'].keep_members)
print(departments['B'].keep_members)
print(departments['C'].keep_members)
組み込みたい箇所
brand_news = {
1: BrandNew(['A', 'B', 'C']),
2: BrandNew(['A', 'B', 'C']),
3: BrandNew(['B', 'A', 'C']),
4: BrandNew(['B', 'A', 'C']),
5: BrandNew(['A', 'C', 'B']),
6: BrandNew(['C', 'A', 'B']),
7: BrandNew(['A', 'B', 'C']),
8: BrandNew(['B', 'A', 'C']),
}
departments = {
'A': Department([1, 2, 4, 8, 3, 6, 7, 5], 2),
'B': Department([1, 7, 4, 5, 3, 2, 8, 6], 2),
'C': Department([5, 6, 7, 8, 1, 2, 3, 4], 4),
}
上記のBrandNew中の'A','B','C'やDepartment中の1~8の整数を重複を避けてランダムに生成したいです。
クラスのインスタンス?というものなのでしょうか。非常に無知で投げやりな質問になってしまっているのですが、どうかご容赦していただけるとありがたいです。これから勉強させていただきます。
また、質問の内容が不十分でしたらご指摘いただけると幸いです。
よろしくお願いいたします。