Page 18 -
P. 18

NOTE Math.random()은 진짜 무작위가 아니다?

                 Math.random()은 암호학적으로 완전한 무작위가 아닙니다. 따라서 보안과 관련된 작업
                 (비밀번호를 생성한다거나)을 할 때는 Math.random()으로 생성된 수를 사용하면 위험합

                 니다. 이를 위한 window.crypto.getRandomValues() 함수가 따로 준비되어 있습니다.





               Math.floor(Math.random() * 9 + 1)을 네 번 호출하면 될 것 같지만, 이렇게 하면 중복된 숫
               자가 나올 수 있습니다. 그러면 어떻게 해야 중복되지 않게 뽑을까요? 우리 주변에서 중복되지
               않으면서 무작위 숫자를 뽑는 일을 생각해 보세요. 바로 로또입니다. 다음 장에서 로또 추첨기

               를 만들지만, 로또 6/45(줄여서 로또)야말로 중복되지 않게 무작위로 7개(당첨 공 6개와 보너
               스 공 1개)의 숫자를 뽑는 대표적인 예입니다. 로또의 원리를 프로그램에 구현하면 됩니다.

               로또는 통에 45개의 공을 모아 두고 공을 하나씩 일곱 번 뽑습니다. 한번 뽑은 공은 통에서 빠
               져나갔으므로 다시 뽑힐 일이 없습니다. 이 프로그램에서도 1부터 9까지의 숫자를 미리 모아

               두고 하나씩 네 번 뽑으면 됩니다.

               1에서 9까지의 숫자를 먼저 모아 두겠습니다. 여러 개의 값을 모아 둘 때는 배열이나 객체를
               사용합니다. 여기서는 배열을 사용해야 할까요? 객체를 사용해야 할까요? 이 질문은 앞으로도
               상당히 자주 나옵니다. 배열을 사용할지 객체를 사용할지에 따라 프로그램 구조가 바뀌게 됩니

               다. 그리고 코딩의 효율성과 성능도 매우 차이가 납니다.

               간단하게 고르는 방법은 단순한 값들의 나열이면 배열을 사용하고, 값에 이름이 붙는다면 객체
               를 사용하면 됩니다. 숫자야구의 숫자들은 단순한 숫자의 나열이므로 배열로 충분합니다.



                   <script>
                     const $input = document.querySelector('#input');
                     const $form = document.querySelector('#form');
                     const $logs = document.querySelector('#logs');


                     const numbers = [];
                     for (let n = 1; n <= 9; n += 1) {
                       numbers.push(n);
                     }
                   </script>



          244
   13   14   15   16   17   18   19   20   21   22   23