我有一个包含 52 张卡片的卡片数组列表。我想洗牌。
这就是我所做的。
- 创建了一个新的数组列表。
- 生成 0 到牌组大小之间的随机索引。
- 在随机索引中获取卡片并添加到新列表。
- 从牌组中取出牌
- 重复直到甲板空了。
这是我的代码:
String[] Number = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
String[] Suits = {"Club","Diamonds","Hearts","Spades"};
ArrayList<Card> deck = new ArrayList<Card>();
// create a deck
for(int i=0;i<13;i++){
for(int j=0;j<4;j++){
Card card = new Card(Suits[j],Number[i]);
deck.add(card);
}
}
// shuffle of deck
ArrayList<Card> new_deck = new ArrayList<Card>();
while(deck.size()!=0){
Random rand = new Random();
int n = rand.nextInt(deck.size());
new_deck.add(deck.get(n));
deck.remove(n);
}
// Display
for(int i=0;i<52;i++){
System.out.println(new_deck.get(i).getSuit()+" : "+new_deck.get(i).getValue());
}
最后,我从新的 ArrayList 中获得了洗牌后的牌组。
它的随机性够不够好?
我应该怎么做才能增加随机性?
最佳答案
Does it's randomness is enough or not ?
定义足够好 (!!)
您当前的方法将提供良好的洗牌,没有明显的偏差......除了随机数生成器可能引入的偏差。
在这种情况下,确实值得关注。 Random 被指定为线性同余生成器,并且 LC 生成器在生成的数字中具有不同的模式。 (在统计术语中,它们显示出很强的自相关性。)如果您绘制第 n 个随机数与 n 的关系图,这一点就很清楚了。
要提高随机性,您应该使用更好的随机数生成器。 SecureRandom
生成器应该足够好:javadoc .
如果您使用 Collections.shuffle
方法,同样需要考虑随机性。对于好的(或一致的)随机播放,您应该在提供Random
实现的地方使用方法重载...并选择一个好的实现。
关于java - 洗牌的随机性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43691935/