프로그래밍 언어/JAVA

<JAVA> 중복되지 않는 무작위 숫자 만들기 Math.random()

창조적생각 2021. 7. 24. 23:40

아직 프로그램을 배운지 얼마 안된 학생으로써 JAVA에서는 생각보다 중복되지 않는 무작위 숫자를 만들기가 어려웠습니다.

이해도 잘 되지 않고 복잡하기에 쓰기가 쉽지 않았습니다.

그러한 어려움을 겪는 분들에게 조금이라도 도움이 되기를 바라며 지금까지 제가 배우면서 사용할 수 있었던 중복되지 않는 무작위 숫자를 만드는 법을 공유합니다.

 

<목차>

 

1.  전체 함수

2. boolean exists(int n[], int index) 함수 part (4번줄 ~ 11번 줄) 해설

3. 메인 메소드 해설(13번줄~23번줄)

 

 

제가 생각할 때 가장 확실한 방법으로는 배열과 do while 문 그리고 boolean 함수를 만들어서 만드는 것이 가장 정확했습니다.

 

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
package random;
 
public class randomcreate {
    
    private static boolean exists(int n[], int index) {
        for (int i = 0; i < n.length; i++) {
            if(n[i] == index)
                return true;
        }
        return false;
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int n[] = new int[4];
        int index = 0;
        for(int i = 0; i<n.length;i++) {
            do {
                index = (int)(Math.random()*10);
            }while(exists(n,index));
            n[i] = index;
        }
        for(int i = 0; i<4; i++)
        System.out.print(n[i]+" ");
    }
 
}
 
cs

 

[실행결과]

 

 

 

1. boolean exists(int n[], int index) 함수 part (4번줄 ~ 11번 줄)

 

 

1.boolean 형태의 함수를 만들어 줍니다. 이 함수는 배열 안에 중복된 수가 있는지 확인 하는 함수입니다.

저는 함수 이름을 'exists'로 정하고 매개 함수로는 정수형 배열 int[] n과 int index로 설정해주었습니다.

 

 

- 여기 int [] n은 중복 없는 수로 만들 배열이고, int index는 배열에 들어갈 수를 하나하나 검사하며 넣기 위해 쓰입니다.

 

 

- for 문을 써서 반복해줍니다. 반복의 길이는 배열 n의 길이만큼 해줍니다.

그리고 만약 n배열 안에 정수 index와 같은 값이 있다면 참으로 리턴해줍니다.

여기서 참으로 반환해주는 이유는 

 

 

21번 줄에서 while문의 조건을 n배열 안에 index가 있다는 조건이 참일 경우 while문을 멈추기 위해서 입니다. 그래야 중복된 값이 있으면 다시 찾아서 다른 수를 넣기 때문입니다.

 

그리고 나머지는 false값이 리턴되게 return false;를 작성합니다.

 

 

2. 메인 메소드

 

2. 이제 메인 메소드를 만들 차례입니다.

만들고 싶은 중복이 없는 무작위 수의 개수만큼의 길이를 가진 정수형 배열을 만들어 줍니다.

 예시로 만들어 볼 중복없는 무작위 수는 4개이기 때문에 int[] n의 길이를 4로 지정해줍니다.

int [] n = new int[4]; 로 하거나 직접 안의 수를 넣으려면

int [] n ={-1,-1,-1,-1}; 과 같이 아무 수나 넣어셔서 지정해주시면 됩니다.

그리고 index라는 정수형 변수를 하나 초기화해서 지정해주시면 됩니다.

 

 

for 반복문을 작성해줍니다. 반복횟수는 n배열의 길이만큼입니다.

do while 반복문에서 do 파트에 index 변수에 무작위 정수를 삽입합니다. 저같은 경우에는 0~9까지의 정수를 만들기 위해 Math.random()*10을 입력해주었습니다.

 

 

앞에서 설명 해 주었듯이, while문의 조건을 exists(n,index) 함수 즉, n 배열 안에 동일한 index값이 없다면 계속 n[i]에 index값에 들어간 랜덤 정수를 넣어준다는 는 것이기 때문에 중복된 수 없이 4개의 무작위 수로 이루어진 배열이 완성이 됩니다.

 

 

그리고 출력을 해주면

 

 

이런 식으로 랜덤한 네개의 수로 이루어진 배열이 생성됩니다.

 

<사족>

 

간혹 구글링을 하다보면 이중 for 문을 써서 중복수를 배제하는 방법을 볼 수 있는데, 이중 for 문을 쓰면 배열의 0번째에 있는 수를 비교할 수 없기때문에 하나의 중복 수가 생길 가능성이 있습니다.

 

그렇기때문에 이러한 boolean 함수로 배열 안을 구성하고 있는 수들을 직접 배제해주는 것이 지금까지 써 본 방법 중 가장 안정적인 방법이었습니다.

 

[처음으로 돌아가기]

 

 

728x90