2016-09-18 4 views
0

주제에 대해 많은 내용을 읽었지 만 여전히 그것에 대해 불안감이 있습니다. 제발 도와주세요! 내가되지 않은 패턴이나 기능에 따라 제대로 덱을 셔플하고 싶습니다 지금자바 카드를 섞으십시오.

int[] deck = new int[52]; 
for (int i = 0; i < deck.length; i++) {deck[i] = i;} 

:

나는 52 개의 카드를 만들 수 있습니다. 나는 인 Math.random() 내 알고리즘 방법을 사용하기 위하여려고하고있다

는 :

for (int i = 0; i < deck.length; i++) { 
    int j = (int)(Math.random() * deck.length); // Get a random index out of 52 
    int temp = deck[i]; // Swap the cards 
    deck[i] = deck[j]; 
    deck[j] = temp; 
} 

내가 여기 데 문제 그러나 가끔 중복을 얻을 수 있다는 것입니다; 결과적으로 일부 카드/값이 누락되었습니다.

나는 이미 사용 된 색인/값을 폐기하지 않을 것이 거의 확실합니다. 이는 위에 언급 한 문제의 핵심입니다. 그런데 어떻게해야합니까?

제안 사항? 아마, 내 생각의 똑같은 기차를 따라 가야 겠지. 무리 감사!

screenshot 1

screenshot 2

+0

중복? j의 중복 값? 나 그리고 j? 어떤? –

+0

무작위로 생성 및/또는 이미 할당 한 사본 중복 –

+0

중복 결과를 보여주는 예를 보여줄 수 있습니까? 중복을 생성하는 코드에는 실수가없는 것 같습니다. 어쩌면 중복을 테스트하는 방식이 잘못되었을 수도 있습니다. –

답변

-1

이 도움이되는지를보고하십시오 :

boolean init[] = new boolean[52]; 
Random r = new Random(); 

int getNextCard(){ 
    int i = r.nextInt(52); 
    while(init[i]) 
     i = r.nextInt(52); 
    init[i] = true; 
    return i; 
} 

void shuffleCards() { 

    int[] deck = new int[52]; 
    for (int i = 0; i < deck.length; i++) { 
     deck[i] = getNextCard(); 
    } 
    System.out.println(Arrays.toString(deck)); 
} 

아이디어가 번호를 촬영하면 0에서 52 사이의 난수를 생성하는 Random을 사용하는 것입니다 우리가, 부울 배열 init에서 찍은 것으로 표시합니다. 다음 번에 동일한 숫자가 나타나면 우리가 아직 가져 가지 않은 숫자를 얻을 때까지 다시 난수를 생성합니다.

+0

이것은 섞여 있지 않습니다. 이것은 다시 채워지고 있습니다. – Guy

+0

하지만 이것은 셔플 세트를 생성합니까? – Fayaz

+0

사실, 순서가 다릅니다. 그러나 이것은 의문이 아닙니다. – Guy

2

셔플 카드에 새 배열을 사용하고 이전 배열에서 제거한 무작위 카드를 사용하여 채우기 만하면됩니다.

import java.util.ArrayList; 

public class Test { 
    private static final int DECK_SIZE = 52; 

    public static void main(String args[]) { 
     ArrayList<Integer> deck = new ArrayList<Integer>(); 

     for (int i = 0; i < DECK_SIZE; ++i) { 
      deck.add(i); 
     } 

     ArrayList<Integer> shuffledDeck = new ArrayList<Integer>(); 

     while (deck.size() > 0) { 
      int index = (int) (Math.random() * deck.size()); 
      shuffledDeck.add(deck.remove(index)); 
     } 

     System.out.println(shuffledDeck.toString()); 
    } 
} 

또는 사용 Collections.shuffle() : 무엇

import java.util.ArrayList; 
import java.util.Collections; 

public class Test { 
    private static final int DECK_SIZE = 52; 

    public static void main(String args[]) { 
     ArrayList<Integer> deck = new ArrayList<Integer>(); 

     for (int i = 0; i < DECK_SIZE; ++i) { 
      deck.add(i); 
     } 

     Collections.shuffle(deck); 

     System.out.println(deck); 
    } 
} 
+0

도와 주셔서 감사합니다! –