了解java中的数组

时间:2014-01-31 08:06:21

标签: java arrays

我正在阅读一本关于java的书,并在“Arrays”下给出了这个例子。

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-i)); ”用于洗牌?请解释一下这行是做什么的,以及明确使用这一行的原因。(关于为何使用这一行的逻辑)

1 个答案:

答案 0 :(得分:5)

Math.random()返回介于0.0和1.0之间的随机double,当此数字乘以N-i时,我们会在这两个数字之差的范围内收到一个数字(双精度数): [0,N-i]

通过添加i,我们将范围从[0,N-i]“转移”到[i,N],因为它是双倍的,我们会转换为int以接收整数。< / p>