2017-06-13 81 views
0

我正在嘗試實現一副卡片併爲其創建洗牌方法。當我在主要方法中寫入時,一切正常,但當我試圖用不同的方法來完成時,即使使用隨機播放方法後,我也得到了原始序列(不是混洗)。我做錯了什麼?卡片和洗牌方法

import java.util.*; 

public class DeckOfCards { 

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

    private int[] cards; 
    public DeckOfCards(){ 

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

    public void shuffle(int num){ 

     for(int i = 0; i < num; i++){ 
      int m = (int)Math.random() * cards.length; 
      int n = (int)Math.random() * cards.length; 

      int t = cards[m]; 
      cards[m] = cards[n]; 
      cards[n] = t; 
     } 

    } 

    public void display(){ 
     for(int i = 0; i < 52; i++){ 
      String suit = suits[cards[i]/13]; 
      String rank = ranks[cards[i] % 13]; 
      System.out.println(rank+" of "+suit); 
     } 
    } 


    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     DeckOfCards d = new DeckOfCards(); 
     d.display(); 
     d.shuffle(50); 
     d.display(); 

    } 

} 
+2

注意:您還可以使用'Collections.shuffle'。 –

+1

@ArnaudDenoyelle:如果他們有適當的卡片收藏,這將是最好的方法。 – Makoto

+0

@Arnaud謝謝,我意識到這一點,但我正在準備面試,所以試圖實現,而不是使用Collections.shuffle。 –

回答

9

int m = (int)Math.random() * cards.length; 

總是零,因爲它計算(int) Math.random()(零),然後通過cards.length相乘。

你的意思是:

int m = (int) (Math.random() * cards.length); 
int n = (int) (Math.random() * cards.length); 
+0

謝謝。這是一個愚蠢的錯誤! –

-3

而不是依靠的Math.random的,Java有一個使用它自己隨機種子隨機類:

Random random = new Random(System.currentTimeMillis()); 

int m = random.nextInt(cards.length); 
int n = random.nextInt(cards.length);