2016-09-27 21 views
0

嗨我试图随机洗牌,并打印“顶部”四张牌,我的老师告诉我想到洗牌循环作为交换,但我不知道即时通讯正确。任何帮助,将不胜感激。如何在一个循环中洗牌和打印它们

public static void main(String[] args) 
{ 
    //Random number generator for shuffle 

    Random rand = new Random(); 

    //Explaining the program 

    System.out.println("This program is meant to create a deck of cards and to show the top 4 cards"); 

    //All Arrays 

    int [] deck = new int [52]; 
    String [] suits = new String []{"Hearts, Spades, Clubs, Diamonds"}; 
    String [] faceValue = new String []{"Ace, 2,3,4,5,6,7,8,9,10, Jack, Queen, King"}; 

    //Filling the deck 

    for(int index = 0; index < deck.length; index ++) 
    { 
     deck[index] = index+1; 
     //System.out.println(deck[index]); 
    } 

    //Shuffle the deck 

    for(int i =0; i<deck.length; i ++) 
    { 
     int temp = rand.nextInt(51)+1; 
     deck[i] = temp; 
     deck[i] = deck[temp]; 
     deck[i] = temp; 
     //System.out.println(deck[i]); 


    } 
    //Display 
    for(int index = 0; index<4;index++) 
    { 
     String suit; 
     String face; 
     suit = suits[deck[index]/13]; 
     face= faceValue[deck[index]%13]; 
     System.out.println("Your cards are:\n"); 


    } 
+0

看看费舍尔耶茨算法随机洗牌 – Rishi

+0

嗯..我建议[这](http://docs.oracle.com/javase/8/docs/api/java/util/Collections。 html#shuffle-java.util.List-),但由于它的学校作业,你可能应该自己实现它 –

+0

“我为我的作业写的代码不起作用”不是问题。这是一个故事。这甚至不是一个有趣的故事。请学习一些[基本的调试技巧](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/),并在您对我们有特定问题时随时回来。 –

回答

0
int temp = rand.nextInt(51)+1; 
deck[i] = temp; 
deck[i] = deck[temp]; 
deck[i] = temp; 

这不洗牌什么。它甚至不使用数组的元素作为最终的数组元素。

你可以在这里实现与

deck[i] = rand.nextInt(51)+1; 

取而代之的是同样的效果 - 无论your're试图在这一循环做,你应该接近这样的问题:

for i = deck.length-1, deck.length-2, ..., 2, 1 
    select j uniformly at random from 0, 1, ..., i-1, i 
    swap elements at indices j and i 

循环迭代后的这种方式,您选择了索引>=i上的元素,并且您只考虑后面迭代中的其余元素

或Java代码:

for (int i = deck.length-1; i > 0; i--) { 
    int j = rand.nextInt(i+1); 
    int temp = deck[i]; 
    deck[i] = deck[j]; 
    deck[j] = temp; 
} 

而且注意,打印阵列可能会失败,如果你初始化像这样的平台:

for(int index = 0; index < deck.length; index ++) 
{ 
    deck[index] = index+1; 
} 

如果最后一个元素是第一批4个元素在混洗之后,您使用4 = 52/13作为suits阵列的索引,这会导致ArrayIndexOutOfBoundsException

相反,你需要初始化索引是这样的:

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

而且你使用含有单一字符串,而不是使用数组与多个元素的数组:

String [] suits = new String []{"Hearts", "Spades", "Clubs", "Diamonds"}; 
String [] faceValue = new String []{"Ace", "2","3","4","5","6","7","8","9","10", "Jack", "Queen", "King"}; 
+0

非常感谢 – JoBrien

0

交换两个值你必须这样做:

temp = a; 
a = b; 
b = temp; 

所以在你的情况下,你应该有两个临时变量 - temprandrand将表示将与我们当前卡交换的卡的索引。

int rand = rand.nextInt(51) + 1; 
temp = deck[i]; 
deck[i] = deck[rand]; 
deck[i] = temp;