我正在阅读一本关于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)); ”用于洗牌?请解释一下这行是做什么的,以及明确使用这一行的原因。(关于为何使用这一行的逻辑)
答案 0 :(得分:5)
Math.random()
返回介于0.0和1.0之间的随机double
,当此数字乘以N-i
时,我们会在这两个数字之差的范围内收到一个数字(双精度数): [0,N-i]
通过添加i
,我们将范围从[0,N-i]
“转移”到[i,N]
,因为它是双倍的,我们会转换为int
以接收整数。< / p>