- 在网上找到了某个公司的面试题,想了好久,感觉自己会做,但是找 不到在线测试(OJ:Online Judge),心烦..
- 交流面试题,想了好久,感觉自己会做,但是找不到在线测试, 好心烦..
- 在网上做笔试,但是前几个测试用例都过了,突然一个巨大无比数据量来 了,结果你的代码报错了,如此大的数据量根本看不出哪错了,你好心烦…(对数器可以输出出错的数据?)
小样本量包含的边界测试有限,几百行长度中找到错误不容易看
- 想不出来思路、想法===>用不到对数器
- 在差办法可以写出来的前提下,用差办法去验证你自认为的最优解===>纯暴力也可以
- 两套思路下的办法===>虽然都可能出错
- 但是用随机生成的数据测几千万次,那么都错或者有一个错就是小概率事件,那么说明算法正确
- 大量的随机测试在不一致的时候将数组样本量改小一点(比如数组长度为5时),看这是哪个样本量这两种方法不一样,打印出这个数组,试一下可能找到你之前没有考虑到的边界条件,特殊的例子导致有一种或者两种都错了
- 最后用肉身干预的方法,(打断点、print大法)一行一行地去看、去干预,把两种方法都改对
- 周而复始,最终长度为5的好多组数据都能通过测试;再加长数据量(几百、几千、……)都对的话就可以说明算法正确,就可以不依赖在线测试了===>对数器(打比赛的方法)
- 大样本随机测试===>覆盖在线测试用力(测试用例是人想出来的,并不是很完美的,很有可能有没有覆盖的情况),但是大样本随机测试覆盖面广,啥都给你测出来了(屎都测出来了)
使用
- 生成的数组值随机(有范围的:-20~20),长度也是随机的(有范围的:0~100)
- 长度随机、值随机、有正有负===>屎都给你测出来!
- 随机数发生器(左闭右开)(0~1等概率返回一个小数===>数学中做不到的,而计算机中是离散的,超过精度就不要了,所以是可以完成的)
- Math.random()->[0,1)所有小数,等概率返回一个
- Math.random()*N->[0,N)所有小数,等概率返回一个;再用int强制类型转换转换为[0,N-1)所有整数,等概率返回一个
- 每一个数组元素通过一个随机值减去一个随机值===>可正可负可为0===>两次随机行为(两数都随机,大概率是不一样的)
- 将原始数组保存起来,并将出错的情况打印出来(打印一下)===>把数组改小方便找错(在for循环中把每一行打印出来)===>500,000组数组通过nice!
// for test
// 数组长度与数值都随机
public static int[] generateRandomArray(int maxSize, int maxValue) {
// Math.random() -> [0,1) 所有的小数,等概率返回一个
// Math.random() * N -> [0,N) 所有小数,等概率返回一个
// (int)(Math.random() * N) -> [0,N-1] 所有的整数,等概率返回一个
int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; // 长度随机
for (int i = 0; i < arr.length; i++) {
// 两次随机行为
arr[i] = (int) ((maxValue + 1) * Math.random())
- (int) (maxValue * Math.random());
}
return arr;
}