Java:洗牌32张牌?

时间:2015-06-10 01:53:14

标签: java methods shuffle

我自己写了这个方法我想知道是否有更好的方法吗?

public Card[] shuffle(){
    for(int i = 0; i < Deck.length; i++){
       int x = i + (int) (Math.random() * (32 - i));
       Card temp = Deck[i];
       Deck[i] = Deck[x];
       Deck[x] = temp;
    }
    return Deck;
}

3 个答案:

答案 0 :(得分:2)

如果( 32 - i )提供的值低于0,则不检查。该算法称为Fisher-Yates混洗算法,与您的非常相似:

private int [] shuffleMyArray ( int [] array ) {
    int size = array.length, i = 0;
    int temp = 0;
    while ( size != 0 ) {
        i = ( ( int ) ( Math.random () * size-- ) );
        if ( i < 0 ) {
            i = 0;
        }
        temp = array [ size ];
        array [ size ] = array [ i ];
        array [ i ] = temp;
    }
    return array;
}

编辑1:

这两种算法的输出将更好地让你理解两者之间的差异,看看Fisher-Yates如何考虑所有指数,同时改组。

输出:

Actual Array
0 1 2 3 4 
Your Implementation output
i: 0 x: 3
i: 1 x: 4
i: 2 x: 3
i: 3 x: 4
i: 4 x: 4
Fisher Yates implementation output
i: 4 size: 4
i: 2 size: 3
i: 1 size: 2
i: 0 size: 1
i: 0 size: 0

答案 1 :(得分:1)

我要将deck作为参数,方法static。这样它就是自包含的。在Java中,命名约定是使变量和方法名称以小写字母开头。接下来,我知道的最简单的方法是使用Collections.shuffle(List)Arrays.asList(T...)

那样将牌组洗牌。
public static void shuffle(Card[] deck) {
    Collections.shuffle(Arrays.asList(deck));
}

如果您想保留原始deck,那么您可以复制它并return喜欢

public static Card[] shuffle(Card[] deck) {
    List<Card> al = new ArrayList<>(Arrays.asList(deck));
    Collections.shuffle(al);
    return al.toArray(new Card[deck.length]);
}

答案 2 :(得分:-1)

如果您选择从整个套牌进行交换的项目,我猜您可以获得更好的结果,而不仅仅是剩余的卡片,如下所示:

public Card[] Shuffle(){
    for(int i = 0; i < Deck.length; i++){
       int x = (int) (Math.random() * 32);
       Card temp = Deck[i];
       Deck[i] = Deck[x];
       Deck[x] = temp;
    }
    return Deck;
}