我想在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次运行代码但输出在我的机器中始终相同。我希望每次运行都有不同的输出。 请指教。
答案 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);
}
}