본문 바로가기

Android Studio

JAVA - 랜덤함수 (중복제거)

반응형

1에서 10 사이에 숫자를 랜덤으로 중복 없이 5개의 숫자를 뽑아내려면

여러 방법이 있지만 아마도 많이 쓰는 방법은...

public static void main(String[] args) {
   
        int a[] = new int[5];
        List<Integer> list = new ArrayList<>();
        Random r = new Random();

        for(int i=0;i<=4;i++)
        {
            a[i] = r.nextInt(10)+1; 
            for(int j=0;j<i;j++) 
            {
                if(a[i]==a[j])
                {
                    i--;
                }
            }
        }

        for (int value : a) {
            list.add(value);
        }

        Collections.sort(list);
        System.out.println(list);
    }

위에 코드처럼 a에 Random을 이용해 1 ~ 10 사이의 값을 입력하면서 a에 중복 값이 있음 i의 증가를 빼서

다시 값을 받아와 또 중복검사... 이런 방법으로 중복 없이 1에서 10 사이의 값 5개를 가져옵니다.

 

하지만 한눈에 이해하기 힘든 구조입니다. 이 방법으로 사용해도 되지만
이해하기 쉬우며 더 간결하게 바꿔보면...

public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();

        while (set.size() < 5) {
            Double d = Math.random() * 10 + 1;
            set.add(d.intValue());
        }

        List<Integer> list = new ArrayList<>(set);
        Collections.sort(list);

        System.out.println(list);
}

Set의 중복을 허용하지 않는 특성을 이용해 더 간결하게 만들어 봤습니다.

set.size()가 5보다 크면 while문이 반복을 끝내는 구조인데

Math.random을 이용해 1~10 사이의 랜덤 값을 set에 저장합니다. 

만약 같은 값이 들어오면 set은 저장을 하지 않으므로 set.size()가 증가하지 않으니 while문은 5보다 클 때까지 

돌게 되는 구조입니다.

 

마지막으로..

List<Integer> list = new ArrayList<>(set);

Collections.sort(list);

생성된 숫자들을 배열에 넣어 sort 까지 해주면 깔끔하게 끝~

 

위에 코드보다 간결하며 이해하기 쉬운 구조가 아닌가 생각해 봅니다.

더 좋은 코드가 있음 댓글에 남겨 주세요.. 

초보탈출 그날까지 쭉~

반응형