groups=[]
while len(clone):
smallGroup=[]
for i in range(userCount):
if(len(clone)==0):
break
selectedIndex = random.randrange(0,len(clone))
item = clone.pop(selectedIndex)
smallGroup.append(item)
groups.append(smallGroup)
뽑는 횟수 userCount만큼 원소를 랜덤으로 꺼내면서 그와 동시에 기존 집합clone에서 뽑은 원소는 제거합니다. 2개의 데이터가 뽑아지면 groups에 등록하고, 개수가 부족할 때 까지 무한 반복합니다.
클래스화
랜덤으로 사용자를 뽑는 기능을 만들었고, 여러분들이 패키지로 만들어서 다른 개발자에게 배포한다고 가정 해 봅시다. 사용하는 입장에서는 이 소스코드를 그대로 다시 작성하기엔 좋지 않아보입니다.
그럴 땐 클래스로 묶어서 기능을 구현할 수 있습니다.
클래스는 어떤 하나의 주제에 대한 기능을 모아둔 설계도이라고 볼 수 있으며, 여기서는 랜덤 그룹 뽑기를 처리 해주는 클래스를 정의해야 합니다.랜덤 뽑기를 하기 위해서는 랜덤 뽑기 대상이 될 사용자를 추가하거나 제거할 수 있으며, 이 사용자들을 바탕으로 랜덤 그룹 뽑기를 진행할 수 있습니다. 이러한 코드들을 정의하면 아래와 같습니다.
import random
class RandomGroup():
__slots__ = ['__users']
#생성자 : 주요 구성 요소를 초기화 합니다.
def __init__(self):
self.__users=[]
#사용자 추가 : 랜덤 뽑기 사용자를 추가 합니다.
def addUser(self,userName):
self.__users.append(userName)
#사용자 추가 : 랜덤 뽑기 사용자를 리스트로 받아 추가합니다.
def addUserByArgs(self,*userName):
for x in userName:
self.__users.append(x)
#사용자 제거 : 대상 사용자를 제거합니다.
def delUser(self,userName):
self.__users.remove(userName)
#사용자 가져오기 : 사용자 리스트를 반환합니다.
def getUsers(self):
return self.__users
def getRandomUser(self):
return self.__users[random.randrange(0,len(self.__users))]
#랜덤 뽑기를 빌드 합니다.
#userCount는 몇 명씩 묶을 것인지에 대한 파라메터입니다.
def build(self, userCount):
clone = self.getUsers().copy()
groups=[]
while len(clone):
smallGroup=[]
for i in range(userCount):
if(len(clone)==0):
break
selectedIndex = random.randrange(0,len(clone))
item = clone.pop(selectedIndex)
smallGroup.append(item)
groups.append(smallGroup)
return groups