본문 바로가기

app/java

중복 없는 랜덤 숫자 뽑기

원본: http://blog.naver.com/seogi1004/100017307360

원본에선 C#으로 되어 있던 것을 java로 짜봤습니다.

잼있는게 중복이 있는지에 대한 if 문을 없애고 새롭게 했다는거에 재밋었음.

if 문을 없애기 때문에 필요한 for문또한 줄어들어서 log2O 만큼의 시간 절약.(아마?)

- 기본적인 알고리즘엔 랜덤으로 뽑은 값이 기존의 배열에 있는지 확인하는 루틴을 제거 했기 때문에

  배열을 돌아야할 for문의 시간과 각각의 배열을 비교할 if 문을 제거 했기 때문에 절약 가능.

but 배열대신 링크드 리스트를 사용해서 메모리는 더쓸수도.. 배열은 개인적으로 사용하기 싫어서..

단점이 또하나 있는데 연속적인 링크드리스트를 실행하고 값을 집어 넣고 시작하기 때문에 연속적이지 않은 랜덤

뽑기에선 비효율적 메모리 사용(쓸데없이 많은 공간을 차지 할수도 있음 -  여기에 대한 보안은 랜덤값을 뽑아내서 리스트에 넣고 뽑아낼려는 숫자만큼만 for문을 돌려주면 되겠다. - 요건 다음에 만들어 봐야지).


import java.util.LinkedList;

import java.util.Random;


public class test {

    public static void main(String[] args) {

        LinkedList<Integer> list = new LinkedList<Integer>();


     for(int i = 0; i < 100; ++i)

         list.addLast(i);   // 1~100까지의 값을 집어 넣음

    

     Random random = new Random();


     for(int i = list.size(); i > 0; i--)

     {

         int index = random.nextInt(i);      //현재 list 길이 만큼의 숫자에서 랜덤 숫자 뽑아냄

         int random_number = (Integer)list.get(index);  //랜덤 값이 나온 값을 리스트에서 뽑아냄 (결국 랜덤으로 나온 값을 뽑아내는것과 같음

         System.out.println(random_number + "   count : " + i); 

         list.remove(index);       //뽑아낸 리스트 제거           

     }

    }

}


- 리스트에 값을 집어 넣는 이유는 for 문을 돌면서 랜덤 값으로 뽑아낸 값을 제거 하기 위함이다.
  만일 리스트의 값이 없다면 제거를 못하기 때문에 값에 대한 중복을 확인을 못한다.
- 결국 기존에 if ,for 문을 대신 하기 위해서 리스트를 사용하게 되는거지.