2014-01-31 3 views
1

자바에 관한 책을 읽었으며 "배열"아래에이 예제가 주어졌습니다. 자바의 배열 이해

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이 = 내가 + (INT) (인 Math.random() * (N-I를));"이유를 알고 싶은 덱을 셔플하는 데 사용? 이 라인으로 수행되며,이 라인이 명시 적으로 사용 된 이유는 무엇인지 설명하세요. (논리를이 사용 된 이유에)

+2

[피셔 - 예이츠 셔플] (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