파이썬 리스트에서 랜덤 배열하고싶습니다.

조회수 4965회

리스트에 1-100 사이의 난수를 100개 저장해서 한 줄에 10개씩 출력하고 싶습니다.

예를 들면

77  82   5  13  91  85  43  22  23  90
.
.
.
33  12  95  35  21  34  68  51  53   9

중간에 ...은 편의상 생략했습니다. 아무튼 이런식으로 1-100 사이의 수를 랜덤으로 10 x 10씩 배열하고 싶습니다. 코드를 계속 수정해봤는데도 잘 모르겠네요. 일단 마지막에 쓴 코드는 이렇습니다.

import random

mynum = []
for i in range(100):
    k = random.randint(1, 100)
    while True:
        k = random.randrange(1, 101)
        if k not in mynum:
            break
    mynum.append(k)

for i in range(len(mynum)):
    print("%3d"%i, end=' ')
    if i%10 == 9:
        print('\n')

파이썬을 시작한지 얼마 안됐기 때문에 되도록 기초적인 기능으로 설명해주시면 감사하겠습니다. 또 여기서 잘못된 부분들이 뭔지 싹 다 알고싶습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 잘했구요. 마지막에 랜덤으로 수집한 숫자들을 나누어 보여주는 부분만 다음과 같이 고치면 됩니다.

    for i, n in enumerate(mynum):
        print("%3d"%n, end=' ')
        if i%10 == 9:
            print('\n')
    

    이미 뽑은 걸 다시 뽑지 않기 위해서 뽑기를 다시 무작위로 반복하는데, 현재 100개일 때에는 시간에 문제가 없지만, 훨씬 큰 숫자일 때에는 속도 이슈가 나올 수도 있다고 생각됩니다. 백만이라고 하면요. 한개만 더 뽑아야 할 때, 마지막 뽑힐 수는 정해져 있지만, 위 코드에서는 랜덤함수로 무작위로 다시 뽑아요. 그래서 백만분의 1 확률의 뽑기를 반복해야 합니다. 약 백만번정도 해야 마지막 숫자까지 뽑을 수 있어요.

    조금 더 개선하는 방법은, 아직 뽑히지 않은 숫자들은 set 에 넣어놓고 무작위로 하나씩 뽑는 방법이 있을 거구요. 파이썬에서는 리스트나 셋이 주어지면 그 중에서 하나를 뽑아주는 함수도 있습니다.

    하지만 이런 유형 문제에서 가장 효율적인 것은 shuffle 이라는 걸 이용하는 겁니다. 화투패섞듯이 순서만 섞는 거에요. random 모듈에 있습니다.


    random shuffle

    >>> import random
    >>> l = list(range(1, 101))
    >>> l
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
    >>> random.shuffle(l)
    >>> l
    [61, 77, 64, 3, 83, 22, 100, 98, 60, 47, 79, 9, 46, 97, 45, 56, 58, 30, 71, 37, 4, 86, 68, 67, 27, 72, 31, 17, 29, 16, 70, 65, 24, 99, 76, 50, 92, 12, 95, 2, 25, 21, 88, 39, 23, 1, 96, 8, 93, 33, 63, 91, 7, 32, 36, 87, 42, 14, 80, 34, 66, 10, 62, 85, 73, 74, 40, 6, 41, 48, 28, 13, 53, 52, 35, 57, 38, 89, 69, 43, 26, 81, 44, 19, 82, 18, 55, 90, 75, 54, 15, 49, 20, 11, 51, 84, 5, 59, 94, 78]
    >>> for i in range(10):
        print(''.join(map(lambda n:'%3s '%n, l[10*i:10*(i+1)])))
    
    
     61  77  64   3  83  22 100  98  60  47 
     79   9  46  97  45  56  58  30  71  37 
      4  86  68  67  27  72  31  17  29  16 
     70  65  24  99  76  50  92  12  95   2 
     25  21  88  39  23   1  96   8  93  33 
     63  91   7  32  36  87  42  14  80  34 
     66  10  62  85  73  74  40   6  41  48 
     28  13  53  52  35  57  38  89  69  43 
     26  81  44  19  82  18  55  90  75  54 
     15  49  20  11  51  84   5  59  94  78 
    

    random.choice 로 하나씩 뽑기

    >>> l = list(range(1, 101))
    >>> r = []
    >>> random.choice(l)
    37
    
    >>> while l:
        c = random.choice(l) ## 선택하고
        r.append(c)          ## 결과리스트에 집어넣고
        l.remove(c)          ## 원래 리스트에서는 삭제한다
    
    >>> l
    []
    >>> r
    [65, 32, 15, 2, 45, 47, 11, 98, 97, 42, 36, 87, 40, 35, 55, 65, 12, 96, 74, 91, 48, 21, 54, 3, 1, 75, 16, 77, 82, 68, 67, 44, 51, 89, 90, 57, 20, 29, 85, 34, 63, 81, 27, 23, 28, 46, 49, 25, 66, 22, 69, 80, 70, 86, 59, 73, 19, 31, 71, 37, 62, 61, 72, 99, 60, 43, 84, 39, 52, 78, 17, 14, 64, 18, 13, 5, 4, 83, 93, 53, 92, 26, 33, 95, 76, 24, 30, 88, 56, 8, 9, 94, 58, 41, 50, 38, 6, 7, 100, 10, 79]
    >>> for i in range(10):
        print(''.join(map(lambda n:'%3s '%n, r[10*i:10*(i+1)])))
    
    
     65  32  15   2  45  47  11  98  97  42 
     36  87  40  35  55  65  12  96  74  91 
     48  21  54   3   1  75  16  77  82  68 
     67  44  51  89  90  57  20  29  85  34 
     63  81  27  23  28  46  49  25  66  22 
     69  80  70  86  59  73  19  31  71  37 
     62  61  72  99  60  43  84  39  52  78 
     17  14  64  18  13   5   4  83  93  53 
     92  26  33  95  76  24  30  88  56   8 
      9  94  58  41  50  38   6   7 100  10 
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)