【发布时间】:2012-03-10 16:09:43
【问题描述】:
我有一个称为shuffle 的方法,就像我在下面展示的那样,它对整数的ArrayList 进行洗牌。我想知道,我必须测试这种方法吗?
public void shuffle(){
Collections.shuffle(numbers);
}
我正在使用这种方法来洗一副 52 张牌,在这种情况下,它有点难看(通过测试牌是否被洗过,因为你可能有两张牌连续相同的号码或相同的花色,仍被视为洗牌。
【问题讨论】:
-
尝试产生一个随机种子..并应用于
Collections.shuffle方法...类似于:long seed = System.nanoTime(); Collections.shuffle(numbers, new Random(seed)); -
在什么情况下?如果您曾经使用或编辑此方法,我会测试 Collections.shuffle(numbers) 是否符合您的期望。如果其他人将来可能会编辑此方法,可能值得编写一个单元测试,以防他们决定更改您的实现,但不了解/不了解要求。您可以测试边缘情况,例如,当给定的数字包含重复项时,shuffle 会做什么,或者当给定一个不支持 set 操作的集合时,shuffle 会做什么。
-
@user1181847:通常默认的改组算法不足以防止攻击。过去,至少有一个在线扑克网站的洗牌算法被盗版者找出,然后他们开始击败其他玩家。现在大多数在线扑克网站都使用非常先进的洗牌方法,其中一些甚至使用提供“真正”随机来源的物理设备。为了防止攻击,您至少需要一个加密安全的伪随机数生成器 (CSPRNG)。 Collections.shuffle() 不适合涉及真钱的情况(例如在线扑克网站)
标签: java collections arraylist shuffle