2019년 11월 13일 수요일

파이썬 : Shuffle(섞기) 구현해보기



오늘은 파이썬으로 Shuffle을 구현해볼 것이다.
여기에 사용되는 모듈은 random 모듈이다.


자, 우선 가장 기본적인 방법을 생각해보자.
1부터 5까지의 수가 있다고 할 때

5개의 난수 set를 생성해서 정렬을 해준다.
그럼 난수 배열에 맞는 새로운 1부터 5까지의 정수 배열이 탄생할 것이다.

아래는 그걸 코드로 구현해본 것이다.


#리스트 Shuffle하기 : 기본

import random
import math

card = [1,2,3,4,5]
tmp = []

for x in card:
    tmp = tmp + [[random.random(), x]]

tmp.sort()

shuffleCard = []
for y in tmp:
    shuffleCard = shuffleCard + [y[1]]

print(shuffleCard)
[2, 1, 3, 4, 5]



자, 여기서 한 단계 더 나아가보자.
1~5까지의 고정 리스트가 아니라
리스트까지 랜덤하게 생성하고 싶다면?

아래와 같이 코드를 변경해주면 된다.

randint라는 수를 생성해서 1부터 임의의 정수까지 숫자를 리스트화 시켰다.

#리스트 Shuffle하기 : 리스트 길이까지 랜덤으로 생성

import random
import math

rand = random.randint(5,10)

card = []
for i in range(rand):
    i += 1
    card = card + [i]

print(card)
tmp = []

for x in card:
    tmp = tmp + [[random.random(), x]]

tmp.sort()

shuffleCard = []
for y in tmp:
    shuffleCard = shuffleCard + [y[1]]

print(shuffleCard)



여기까지 이해했다면
파이썬으로 Shuffle하는 방법은 무궁무진 하다는걸 느낄 것이다.

위에서는 그냥 한가지의 방법만 사용한 것이다.

그래서 한가지를 더 생각해봤다.

버블소팅에 착안해서..
임의의 두 장의 카드를 뽑아서 뒤집은다.
그리고 그러한 과정을 수십, 수백, 수천번 반복시킨다.

그럼 이 결과 또한 제대로 섞인 결과가 나오지 않겠는가?

한번 코드로 구현해봤다.

아래는 위 알고리즘으로 189,042번 카드를 뒤집은 것이고
그 결과 [3,1,2,4,5]라는 멋진 결과가 도출되었다.

제대로 섞인 것이다

#리스트 Shuffle하기 : 조금 더 재밌는 방법으로

import random
import math


card = [1,2,3,4,5]
lenCard = len(card)



cntShuffle = random.randint(100000,200000)
print(cntShuffle) #검증용

tmp = []
for x in range(cntShuffle):
    #i와 j에 난수 배정하기
    i = random.randint(0,lenCard-1)
    j = random.randint(0,lenCard-1)
    #print(i,j) #검증용
    
    #card[i]와 card[j] swap
    tmp = card[i]
    card[i] = card[j]
    card[j] = tmp

print(card)
189042
[3, 1, 2, 4, 5]



댓글 없음:

댓글 쓰기