2011-03-05 5 views
1

이것은 인터뷰 질문입니다. 몇 가지 힌트를주세요 :java : card shuffle,

벡터를 사용하여 방법을 구현하고 카드 덱을 섞습니다.

public class Card { 
    private int value; 
    Card(int v) { 
     value = v; 
     } 

    public void print(){ 
     System.out.print(value+";"); 
    } 
} 



public class DeckShuffle { 

    private final int num; 
    Vector<Card> deck = new Vector<Card>(); 

// implement this shuffle function. DO NOT USE Collections.shuffle() !! 
public void shuffle(){ 
// your code goes here! 
} 



} 

답변

4

Collections.shuffle()의 코드가 JDK 또는 오픈 JDK에서 소스 번들에 찾았지만 알고리즘 (배열에 같은 컬렉션에 대한 기본적으로 같은) 아주 간단 할 수 있습니다

given a[] 
for i <- 0..a.length-2 
    rnd_index <- random(i, a.length) #inclusive, exclusive 
    swap a[i] and a[rnd_index] 
next 

이 작품 제자리에 추가 병렬 메모리가 필요하지 않습니다. Fisher Yates shuffle으로 알려져 있습니다.

0

여기에 떠오르는 내용은 다음과 같습니다

public void shuffle() { 
    Vector<Card> v = new Vector<Card>(deck.size()); 
    int size = deck.size(); 
    for(int i = 0; i < size; i++) { 
     int index = Math.random() * deck.size(); 
     Card c = deck.remove(index); 
     v.add(c); 
    } 
    deck = v; 
} 

이 건조 코딩이 더 테스트가 수행되지 않습니다.

-2
void Shuffle() 
{ 
    int n= deck.size(); 
    Vector<Card> v = new Vector<Card>(n); 


    for (int i = 0; i < n; i++) { 
    int j = (int)((i-1) * Math.random())+ 1; 
    if (i != j) { 
     swap(cards, i, j); 
    } 
    } 

    deck = v; 
} 
+2

http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html – Flexo

관련 문제