2014-01-31 35 views
1

我正在閱讀一本關於java的書,並且在「Arrays」下給出了這個例子。瞭解java中的數組

public class Deck { 
    public static void main(String[] args) { 
     String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" }; 
     String[] rank = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" }; 

     // avoid hardwired constants 
     int SUITS = suit.length; 
     int RANKS = rank.length; 
     int N = SUITS * RANKS; 

     // initialize deck 
     String[] deck = new String[N]; 
     for (int i = 0; i < RANKS; i++) { 
      for (int j = 0; j < SUITS; j++) { 
       deck[SUITS*i + j] = rank[i] + " of " + suit[j]; 
      } 
     } 

     // shuffles our deck of cards 
     for (int i = 0; i < N; i++) { 
      int r = i + (int) (Math.random() * (N-i)); 
      String t = deck[r]; 
      deck[r] = deck[i]; 
      deck[i] = t; 
     } 

     // print shuffled deck 
     for (int i = 0; i < N; i++) { 
      System.out.println(deck[i]); 
     } 
    } 

} 

我想知道爲什麼 「INT R = I +(INT)(的Math.random()*(N-1));」 來洗牌?請解釋什麼是這一行做,也就是爲什麼在明確使用這一行。(邏輯,爲什麼這被使用)

+2

這是[Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)算法。 – Jesper

+1

'int r = i +(int)(Math.random()*(Ni))'生成i到N之間的隨機數 –

+0

它用於重新排列卡片(數組卡片的數組元素)隨機的方式。你可以在javadoc中查找Math.random。 – laune

回答

5

Math.random()返回0.0和1.0之間的隨機double時,這個數字是由N-i乘以我們收到一些在這些兩個數值之間的差的範圍(雙):[0,N-i]

通過添加i我們「移」從[0,N-i][i,N]和因爲它是一個雙面,我們爲了接收一個整數轉換爲int的範圍內。

+0

畢竟@alfasin說,用隨機的交換排序算法來改變當前卡。 – Aditzu