-
JavaScript 입문 : 로또추첨기 - 무작위 섞기 2단계 (피셔예이츠 셔플)컴퓨터 알아가기/JavaScript 2022. 5. 10. 19:30728x90반응형
이 글은 제로초 TV의 자바스크립트 강좌를 기본으로 하고 있습니다.
지난 시간까지 배열과 map( ), fill( ) 메소드를 이용하여 공 45개를 준비 하였습니다. 1부터 45번까지의 순서대로 준비된 숫자를 무작위로 섞은 후 섞인 숫자에서 7개를 뽑는 방식으로 로또 추첨기를 만들 예정입니다.
▒ 45개 숫자 무작위 섞은 후 추출 (피셔 예이츠 셔플)
숫자를 무작위로 섞는데 있어서 이전 random( ) 함수를 사용한 적이 있었는데 이를 응용한 방식을 사용할 예정입니다.
이에 전체 모집단을 무작위로 섞고 그 중에서 일정 부분을 추출하는 알고리즘을 배우고자 하는데 이 알고리즘 창시자가 피셔 예이즈 (Fisher Yates)입니다. 이를 피셔 예이츠 셔플이라고 부릅니다.
즉, 빈 배열을 만들고 45개 전체를 무작위로 섞은 후 반복문을 통해서 45개를 뽑아 빈 배열 안으로 집어 넣는 과정을 말합니다. 기존 배열에서 숫자를 뽑은 return값을 빈 배열에 집어 넣는 방식인데 slice 방식을 이용하면 됩니다.
다음은 참고로 기본적인 배열 메소드를 정리한 겁니다. 한번 읽어 보고 진행하면 좋을 듯 합니다.
2022.03.31 - [컴퓨터 알아가기/JavaScript] - JavaScript 입문 : 배열(Array) Method 정리 - 복습
JavaScript 입문 : 배열(Array) Method 정리 - 복습
배열에 관련된 Method를 다시 정리해 볼 필요가 있습니다. 지속적으로 기억에서 사라지니 그때 그때마다 다시 정리를 해 나가면서 기억 저장장치에 억지로라도 새겨 넣을 필요가 있습니다. let a =
happygunja.tistory.com
① 무작위 섞기 (피셔 예이츠 셔플)
다음 코딩을 참조합니다.
console.log(shuffle)을 브라우저에서 확인하면 다음과 같이 나옵니다.
상기 결과는 총 45개의 숫자가 무작위로 섞인 결과값입니다. 즉, 상기 배열은 parents 가 아닌 shuffle 배열입니다. 45개 전체가 무작위로 섞였기때문에 앞에서 6개를 뽑기만 하면 되고 7번째 숫자는 보너스볼로 지정하면 됩니다.
② while문을 for문으로 바꿔보기
상기 코드에서 while문을 사용했습니다. while (parents.length > 0) { } 이었는데 이 내용을 for문으로 바꿔보고 어느 코드가 편한지 어느코드가 어떤 상황에서 사용되는지 알아 둘 필요가 있습니다.
조건은 i 는 모집단의 크기라고 설정하고 갑니다.
다음 코드를 보면 이해가 될 것 같습니다.
코드를 살펴면 조건이 let i = parents.length이므로 parents.length 는 45입니다. 따라서 하나씩 감소해야 하고 그에 따라 Math.random( )에는 i가 곱해져야 합니다. i는 최초 45, 44, 43 순으로 내려가는 원리입니다.
이렇게 while문을 for문으로 바꾸어 보면 for문이 좀 억지 스러운 느낌이 있습니다. 이럴경우 while문이 잘 어울리기 때문에 이런 경우는 while문을 사용하는게 좋을 듯 합니다.
결국 본인이 가장 자연스럽고 편안 방식을 택하는게 코딩인 것 같습니다.
다음 시간에는 공 6개를 뽑고 그 안에서 높은차순 or 내림차순으로 정렬을 해 보도록 하겠습니다.
반응형'컴퓨터 알아가기 > JavaScript' 카테고리의 다른 글
JavaScript 입문 : 로또추첨기 - 당첨볼 추출 및 정렬 / setTimeout( ) 함수 (0) 2022.05.13 JavaScript 입문 : slice( ) 와 sort( ) 함수 메소드 (0) 2022.05.12 JavaScript 입문 : 로또추첨기 - 무작위 섞기 1단계 (배열로 공 45개 준비) (0) 2022.05.09 JavaScript 입문 : 로또추첨기 - 공 모양 만들기 (0) 2022.05.03 JavaScript 입문 : 로또추첨기 - 순서도 (0) 2022.05.02