在4名玩家中随机分配52张牌

时间:2013-12-23 17:55:47

标签: java collections

我想在4名玩家中随机分配52张牌。我虽然我会将每张卡放入HashMap,因为hashmap是无序的和未排序的,然后遍历它并将第1张13张牌分配给玩家1,最后13张牌分配给玩家4。但是当我遍历hashmap时,值总是相同的,我希望每次迭代的值都应该是不同的。下面是使用6号和输出相同的例子。

    public static void main(String[] args) {

    Map<String,String> map = new HashMap<String,String>();
    map.put("1", "one");
    map.put("2", "two");
    map.put("3", "three");
    map.put("4", "four");
    map.put("5", "five");
    map.put("6", "six");

    for(Iterator<Entry<String, String>> iterator =  map.entrySet().iterator(); iterator.hasNext();){
        Entry<String,String> entry = iterator.next();
        System.out.print(entry.getKey()+" "+ entry.getValue() +"\n");
    }

}


Output
3 three
2 two
1 one
6 six
5 five
4 four

N次运行代码但输出在我的机器中始终相同。我希望每次运行都有不同的输出。 请指教。

3 个答案:

答案 0 :(得分:6)

不要使用哈希映射,只使用普通列表和Collections.shuffle()

(哈希映射中元素的顺序由其散列函数给出,它不是随机的。)

答案 1 :(得分:1)

散列映射具有一致的排序,即使它看起来是随机的(它实际上由确定“桶”的hashCode函数确定) - 你可以尝试这样的事情

public static void main(String[] args) {
    Map<String, String> map = new HashMap<String, String>();
    map.put("1", "one");
    map.put("2", "two");
    map.put("3", "three");
    map.put("4", "four");
    map.put("5", "five");
    map.put("6", "six");

    List<String> keyList = new ArrayList<String>();
    for (String s : map.keySet()) {
        keyList.add(s);
    }
    Collections.shuffle(keyList);
    for (String key : keyList) {
        String val = map.get(key);
        System.out.print(key + " " + val + "\n");
    }
}

答案 2 :(得分:0)

这是一个简单但完整的示例,它创建了一个包含52个整数的牌组,将它们随机播放,并为每个玩家打印一张牌。

import java.util.ArrayList;
import static java.util.Collections.shuffle;

class Deck {
    private static ArrayList<Integer> deck = new ArrayList<Integer>();
    // constructor
    public Deck() {
        for (int i=1; i <= 52; ++i)
            deck.add(i);
        shuffle(deck);
    }

    public void deal(int n) {
        for (int i=0; i < n; ++i)
           System.out.println(deck.get(i));
    }

    public static void main(String[] args) {
         Deck d = new Deck();
         d.deal(4);
    }

}