我正在以非常严格的测试驱动开发JUnit氛围进行自我训练。我试图找出测试随机性的最佳方法是在这样的氛围中。例如,我正在实现一个队列和项目的随机队列数组,并立即使用索引为0-(n-1)的项目切换该项目(从而模拟一个随机项目,当它是取出的)。这是我的enqueue方法的一些示例代码:
int randIndex = StdRandom.uniform(size); // generate random index to swap with last item
Item tmp = randArray[randIndex];
randArray[size] = item;
randArray[randIndex] = randArray[size]; //perform swap to create a random item for dequeue
randArray[size] = tmp;
size++;
我想运行一些测试以确保我的enqueue方法实际上是随机地将排队变量与数组中的其他索引一起切换。通常我只是在Main()方法中抛出一些代码,它们遍历一堆enqueue()调用并打印结果,然后我会检查以确保它“感觉”是随机的。
但是,就像我说的,我想在一个非常严格的单元测试框架中这样做。似乎JUnit几乎只使用断言语句,但我不确定我应该断言什么,除非我只是运行一些蒙特卡罗类型的东西并检查平均值对某个epsilon,但这似乎有点用于测试这么简单的方法。
答案 0 :(得分:0)
您可以将测试分为两部分。
1)您通过给定的伪随机数序列测试,您的排队按预期工作。为此定义任何仲裁固定数量的int值:例如“5,2,100,3”。 然后用asser测试enque,deque提供了预期的元素。
2)测试java的Random()
类:你很可能应该省略该测试,因为Random()
已经很好地实现了。
否则对于2)你使用卡方随机数测试,并且那个sstatistic在你所说的soem epsilon中。但是这个犯规有点矫枉过正,所以坚持点1)
答案 1 :(得分:0)
我不确定你的目的是什么,但我读它就像测试随机数发生器本身一样(因为你的转换是非常直接的)。
如果你使用java SecureRandom,你应该对熵有一个很好的一面,参见 SecureRandom。如果您对此表示怀疑,请使用一些熵检查器,或者仅使用互联网中某些来源的一系列真实随机数like here