【发布时间】:2011-06-28 23:25:00
【问题描述】:
我必须测试一下,看看这个方法是否洗过一副牌。 这里是实际洗牌部分的代码。
public void randomShuffle () {
for (int i = 0; i < DECK_SIZE; i++) {
int place = (int)((Math.random()*(51-i))+i);
Card temp = this.cardAt(i);
this.cardList[i] = this.cardAt(place);
this.cardList[place] = temp;
}
}
测试它是否被洗牌的问题是我只能交换两张牌,它会被认为是洗牌。 这是我迄今为止对随机洗牌的测试。
static void randomShuffleTest () {
Deck deck1 = Deck.newDeckOf52();
Deck deck2 = Deck.newDeckOf52();
deck2.randomShuffle();
assert false == deck1.equals(deck2);
}
所以,我的问题是,我如何测试某些东西是否被洗牌了?
【问题讨论】:
-
正如有人所说,你需要一个“足够”的定义。你可以计算出像洗牌的熵之类的东西,但我会说按照 Jigar Joshi 所说的去做并使用 Collections.shuffle() 会更容易。
-
一个公平的洗牌(例如fisher-yates,你的实现)将以相等的概率选择所有洗牌。通过尝试排除“较少洗牌”的结果,您实际上是在 减少洗牌的随机性。
标签: java algorithm random shuffle playing-cards