Math.random 중복값 삭제 방법

[Javascript] 난수 생성하기 (랜덤 숫자, Random Number)

Javascript로 난수를 생성하는 방법을 소개합니다. Math.random() 범위를 지정한 난수 생성하기 0~9 0~10 0~99 0~100 1~10 2~5 난수 생성 함수 만들기 (범위 지정) min <= number <= max ( max 값 포함) min <= nu..

hianna.tistory.com

오늘 만들어 본것은 Random클래스를 활용한 로또 프로그램이다.

Random을 배우면 무조건 필수적으로 한번쯤은 만들어보는 그런 거랄까..?

사실 대한민국 국민이라면 Random함수를 처음 배울 때 누구나 로또를 가장먼저 떠올릴것이다. 

나도 오늘 배우자마자 로또 프로그램이나 만들어보자고 생각해서 바로 만들어 보았다.

생각보다 간단하고 쉽다. 조금만 배운사람이면 누구나 만들 수 있으니 다들 한번쯤 만들어 보길 바란다.

그전에 Random에 대해 알고 넘어 가보자.

Random 클래스가 무엇이냐 하면 java.util 패키지중 하나인 Random은 난수발생기이다. 

일정 범위가 주어지면 그 사이의 수 중 하나를 임의로 선택하게 된다.

걔 중에 가장 많이 쓴다고 하면 역시 nextInt()메서드가 아닐까 싶다.

Scanner를 사용하면 자주 쓰게 되는 int값을 입력 받는건데 랜덤에서도 int값을 랜덤으로 지정하게 하는것이다.

범위를 따로 지정해주지 않으면 int의 광범위한 정수 범위 중 하나의 숫자를 골라주니 보통은 범위를 넣게 된다.

사용방법은 간단하다.

객체.nextInt()를 사용하면 되는데 뒤의 소괄호 사이에 값을 넣어 주게 되면 0 ~ (입력값 - 1)만큼의 숫자 사이에서 임의의 정수 하나를 추출하게 된다.

-1이 되는 이유는 우리가 너무도 잘 아는 컴퓨터의 숫자는 0에서 시작하기 때문이라서! 인데 무슨 말이냐면

예를 들어 입력한 숫자가 10이라고 치면 "10까지의 수 중에 하나를 골라줘!!" 가 아니라, "0부터 10개의 정수 중 하나를 골라줘!!"가 되기때문에 0 ~ 9까지의 숫자중 하나를 부탁하게 되는 것이다. 그래서 0 ~ (입력값 -1)의 범위의 정수 하나를 출력하게 되는 것이다.

그러면 로또 프로그램을 통해 Random을 사용해보자. 막상 보면 엄청 간단하다.

Math.random 중복값 삭제 방법

우선 로또 클래스를 만들고 랜덤 클래스를 객체로 생성한다.

로또는 번호가 6개 이므로 배열의 크기가 6인 정수 배열을 하나 만들어 준다.

temp는 나중에 내림차순 정렬을 위해 필요한 변수이니 하나 만들어 둔다!

그 다음 반복문 for문을 돌려서 numArray 배열에 랜덤한 숫자를 넣어준다.

위에도 설명했지만 로또는 1 ~ 45까지의 숫자 중 랜덤한 6개 숫자이므로

'+1'절대 빼먹으면 안된다. 저게 없으면 0 ~ 44까지 중 숫자를 골라준다.

그리고 이중 for문으로 앞의 수와 뒤의 수가 같은 수이면 횟수를 한번 줄이고 다시 추출하게 하는 

중복제거또한 꼭 해줘야하는 로직이다.

Math.random 중복값 삭제 방법

다음으로는 위에 변수로 만들어 뒀던 temp를 쓸 차례이다.

앞의 입력한 수가 뒤에 입력한 수보다 더 클 경우 temp를 사용하여 한바퀴 돌려 서로의 위치를 바꿔준다. 이런 행동이 반복되면서 숫자는 자연스럽게 내림차순 정렬이 되고 이는 우리가 아는 로또와 같은 6자리의 숫자로 출력이 된다.

Arrays.toString을 이용하면 배열을 반복문 없이 콘솔에 출력할 수 있다.

(이중반복문은 Arrays.deepToString을 사용한다.)

Math.random 중복값 삭제 방법

한번 눌러보니 위의 숫자가 나왔는데 이걸로 이젠 매주 로또를 구매해야겠다고 생각했지만,

역시 자동만큼 편한건 없는 것 같다!ㅋㅋ 간단한 만큼 다들 한번씩 구현 해보자!!

조건문과 Math.random() 함수를 사용하여 중복 없이 로또 번호를 추출해보았다.

자바를 공부하는 사람이면 모두 한번 쯤은 풀어봤을 것이다.

다양한 방법이 있겠지만 나는 아래와 같은 방법을 사용했다.

1. 크기가 6인 int형 배열을 만든다.

2. 배열의 크기만큼 반복문을 돌려 난수를 발생시키고, 그 난수를 배열에 넣는 과정을 반복한다.

    참고:

        - Math.random() 함수는 0.0 이상, 1.0 미만의 난수를 발생시킨다. 

        - 따라서 Math.random()에 45를 곱하면 0.0 이상 45.0 미만의 난수가 발생하는데

        - 로또번호는 1~45이므로 마지막에 1을 더해주면 1.0이상 46.0 미만의 난수를 얻을 수 있다.

        - 그것을 int형으로 변환하여 최종적으로 1 이상 46 미만인 정수가 나오도록 했다.

3. 위의 2번 과정까지 진행하였을 때, 같은 번호가 중복되는 문제가 발생한다. 중복제거하는 코드가 필요하다.

4. 따라서 방금 얻은 난수인 temp를 현재 배열 num에 입력된 모든 원소와 비교한다.

   만약 지금 nums[3]=temp 의 과정을 거쳤다면, nums[0], nums[1], nums[2]까지만 비교하면 되므로 j < i 일때까지만 비교한다.

5. 중복된 원소라면 i 값을 하나 줄여주고 break를 통해 내부 반복문을 빠져나간 뒤 다시 난수 추출을 시작한다. i 값이 하나 줄어들었으므로 중복된 숫자가 들어갔던 인덱스는 새로운 난수로 덮어씌우기 된다. 

6. 배열에 중복 없는 6개의 숫자가 모두 채워지면 반복문을 빠져나오게 된다.

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

package quiz;

public class Lotto {

public static void main(String[] args) {

/*

         * 로또번호 추출. 중복 없는 난수 6개를 추출한다. 1~45 사이의 난수여야 한다.

         */

Scanner sc = new Scanner(System.in);

System.out.print("몇 개의 세트를 추출하시겠습니까?\n>> ");

int set = sc.nextInt();

int cnt = 1;

while (set > 0) {

int[] nums = new int[6];

for (int i = 0; i < nums.length; i++) {

nums[i] = temp;

// 중복제거

for (int j = 0; j < i; j++) {

if (nums[j] == temp) {

i--;

break;

}

}

// for end

System.out.print("\n"+ cnt + "번째 : " );

for (int i = 0; i < nums.length; i++) {

System.out.print(nums[i] + " ");

}

set--;

cnt++;

// while end

}

}

 

출력 : 

Math.random 중복값 삭제 방법