중복 없이 6개 랜덤수 구하는 여러가지 방법(알고리즘)

jy·2024년 7월 8일

Javascript

목록 보기
5/7

flag

// 1. 6개의 빈 리스트를 만든다.
const savedNumbers = [];

// 45개의 플래그 리스트 flase로 초기화 한다.
const flags = new Array(45).fill(false);
console.log(flags);
// 6개의 값을 모두 저장할 때까지 반복한다.
while (savedNumbers.length < 6) {
  // randomValue라는 변수로 0부터 44사이의 랜덤값 생성 (0~44)
  const randomValue = Math.floor(Math.random() * 45);
  // 플래그 리스트에서 해당값의 인덱스를 확인.
  if (!flags[randomValue]) {
    // !는 논리 NOT연산자, iflags[randomValue]가 false인 경우 true로 평가.
    // 즉, flags[randomValue]가 flase면,
    savedNumbers.push(randomValue);
    // randomValue를 savedNumbers 배열에 추가하고,
    flags[randomValue] = true;
    // flags[randomValue]를 true로 변환하여 다시 선택되지 않게함.
  }
}

// 결과값 출력하기
console.log("저장된 6자리 번호:", savedNumbers);
console.log("플래그 리스트 상태:", flags);

! : 논리연산자 NOT

fill()함수 : start index부터 end index 전까지(end index는 미포함) value값으로 채워주는 함수. *지정값을 입력하지 않으면 start는 0, end는 배열의length.

Math : Math 객체는 수학에서 자주 사용하는 상수와 함수들을 미리 구현해 놓은 자바스크립트 표준 내장 객체.

Math.floor : 소수점 이하를 버림.

Math.random : 난수를 지정하는 함수. 범위를 구하려면 min <= number <= max

.
.
.

다른 방법을 사용 할 수 도 있음.


shuffle(Fisher-Yates 알고리즘)

// 0부터 44까지의 숫자를 포함하는 배열 생성
const numbers = Array.from({ length: 45 }, (_, index) => index);

// Fisher-Yates 알고리즘 사용해서 배열 섞기 함수 만들기
function shuffle(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));

    // 요소 교환 (swap)
    [array[i], array[j]] = [array[j], array[i]];
  }
}

// 배열을 섞기
shuffle(numbers);

// 앞의 6개 요소 선택
const selectedNumbers = numbers.slice(0, 6);

// 결과 출력
console.log("선택된 번호들:", selectedNumbers);
  1. for문으로 마지막 인덱스 i부터 첫번째 인덱스인 0까지 반복한다.

  2. 0부터 i까지 무작위 인덱스인 j는 'i+1'로 곱하고 'Math.floor'로 정수로 변환하여 '0'부터 'i'사이의 무작위 정수를 얻는다.

  3. 배열의 현재 인덱스 i 요소와 무작위 인덱스 j요소를 교환한다.(swap)

이해를 돕기 위한 예시

초기 배열: [1, 2, 3, 4, 5]
첫 번째 반복 (i = 4):
j는 0부터 4 사이의 무작위 값, 예를 들어 2 선택.
array[4]와 array[2]를 교환.
교환 후 배열: [1, 2, 5, 4, 3]
두 번째 반복 (i = 3):
j는 0부터 3 사이의 무작위 값, 예를 들어 1 선택.
array[3]와 array[1]를 교환.
교환 후 배열: [1, 4, 5, 2, 3]
세 번째 반복 (i = 2):
j는 0부터 2 사이의 무작위 값, 예를 들어 0 선택.
array[2]와 array[0]를 교환.
교환 후 배열: [5, 4, 1, 2, 3]
네 번째 반복 (i = 1):
j는 0부터 1 사이의 무작위 값, 예를 들어 1 선택.
array[1]와 array[1]를 교환 (자기 자신과 교환).
배열 상태 변화 없음: [5, 4, 1, 2, 3]

언제 활용?

임의의 순서를 생성하거나, 카드 섞기, 랜덤 샘플링 등 다양한 상황에서 활용할 수 있다.


응용: 주민번호 유효성 검사

function juminCheck() {
  let jumin = prompt("주민번호를 입력하세요");
  let juminArray = jumin.split("").map(Number); // 문자열을 배열로 변환하고 숫자로 변환

  // 주민번호 유효성 검사를 위한 체크섬 계산
  const weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
  let sum = 0;
  for (let i = 0; i < 12; i++) {
    sum += juminArray[i] * weights[i];
  }

  let remainder = sum % 11;
  let checkDigit = (11 - remainder) % 10;

  if (checkDigit === juminArray[12]) {
    console.log("유효한 주민등록번호입니다.");
  } else {
    console.log("유효하지 않은 주민번호입니다.");
  }
}

// 함수 호출
juminCheck();
profile
Frontend Developer를 위한 공부중입니다 : )

0개의 댓글