【问题标题】:java: card shuffle,java:洗牌,
【发布时间】:2011-07-09 11:39:05
【问题描述】:

这是一个面试问题。请给一些提示:

使用向量实现方法,洗牌。

public class Card {
    private int value;
    Card(int v) {
        value = v;
        }

    public void print(){
        System.out.print(value+";");
    }
}



public class DeckShuffle {

    private final int num;
    Vector<Card> deck = new Vector<Card>();

// implement this shuffle function. DO NOT USE Collections.shuffle() !!
public void shuffle(){
// your code goes here!
}



}

【问题讨论】:

    标签: java shuffle


    【解决方案1】:

    这就是我想到的:

    public void shuffle() {
        Vector<Card> v = new Vector<Card>(deck.size());
        int size = deck.size();
        for(int i = 0; i < size; i++) {
            int index = Math.random() * deck.size();
            Card c = deck.remove(index);
            v.add(c);
        }
        deck = v;
    }
    

    这是干编码,未进行任何测试。

    【讨论】:

      【解决方案2】:

      Collections.shuffle() 的代码可以在 JDK 或 OpenJDK 的源包中找到,但算法非常简单(对于集合和数组基本上相同):

      given a[]
      for i <- 0..a.length-2
        rnd_index <- random(i, a.length) #inclusive, exclusive
        swap a[i] and a[rnd_index]
      next
      

      这可以正常工作,因此您不需要额外的并行内存。它被称为Fisher Yates shuffle

      【讨论】:

        【解决方案3】:
        void Shuffle()
        {
          int n= deck.size();
          Vector<Card> v = new Vector<Card>(n);
        
        
          for (int i = 0; i < n; i++) {
             int j = (int)((i-1) * Math.random() )+ 1;
             if ( i != j ) {
                 swap(cards, i, j);
             }
          }
        
          deck = v;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-09
          • 2017-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-14
          相关资源
          最近更新 更多