【问题标题】:Method to shuffle integers testing洗牌整数测试的方法
【发布时间】: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


【解决方案1】:

仍然是测试琐碎例程的重点。你可以测试一下

  • 如果这是例程的要求,它会委托给 Collections.shuffle
  • 它实际上是随机播放的

这会让您知道,如果您以后想refactor,该例程仍将遵守其合同。

需要对其进行测试吗?不。测试是务实吗?也许不是。但是每一点保证都有助于验证程序的正确性。最终,由您决定。


编辑 为测试而设计是一种很好的做法。从本质上讲,测试没有副作用的例程更容易,即

作用于其输入、计算值并返回结果的例程。

现在,由于Collections.shuffle 修改了现有列表,因此返回值似乎不明确。让我们考虑可测试性的第二个最佳选择

public void shuffle(List<?> l) {
    Collections.shuffle(l);
}

这种设计是否适合你的情况,我留给你判断。这只是一个一般的fyi :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多