Simple&Natural

Shuffle 구현 본문

언어/Java&Kotlin

Shuffle 구현

Essense 2020. 10. 30. 03:27
728x90

하단 링크의 알고리즘을 이용하여 직접 Collection에 대한 Shuffle 함수를 만들 수 있다.

찾아보니 자체적으로 Shuffle을 지원해주므로 따로 구현할 필요는 없다.

 

자바 api 에서는 다음과 같이 shuffle을 구현하고 있다.

 

public static void shuffle(List<?> list, Random rnd) {
        int size = list.size();
        if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
            for (int i=size; i>1; i--)
                swap(list, i-1, rnd.nextInt(i));
        } else {
            Object arr[] = list.toArray();

            // Shuffle array
            for (int i=size; i>1; i--)
                swap(arr, i-1, rnd.nextInt(i));

            // Dump array back into list
            // instead of using a raw type here, it's possible to capture
            // the wildcard but it will require a call to a supplementary
            // private method
            ListIterator it = list.listIterator();
            for (int i=0; i<arr.length; i++) {
                it.next();
                it.set(arr[i]);
            }
        }
    }

 

 

참고로 swap은 요거

private static void swap(Object[] arr, int i, int j) {
        Object tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

 

 

 

 

랜덤 알고리즘)

en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm

 

Fisher–Yates shuffle - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Algorithm for generating a random permutation of a finite set The Fisher–Yates shuffle is an algorithm for generating a random permutation of a finite sequence—in plain terms, the

en.wikipedia.org

 

 

728x90

'언어 > Java&Kotlin' 카테고리의 다른 글

substring 사용법  (0) 2020.12.25
Java String Format 참고자료  (0) 2020.12.16
Coroutine Async 의 동작 시점  (0) 2020.10.11
Coroutine - withContext 와 coroutineScope 의 비교  (0) 2020.08.29
자바 메모리 관리 - 스택&힙  (0) 2020.06.25