本文主要介绍以下主题:
如何设计随机函数,即洗牌算法?
如何设计测试用例检查随机函数的正确性?
随机函数有哪些应用?
如何设计随机函数
Knuth Shuffle的洗牌算法,算法复杂度O(n),洗牌的目的是产生一串等概率的随机列。
1)如何保证等概率:从r个剩余的元素中选择s个元素,那么下一个元素选中的概率为s/r。
2)假设函数bigrand()返回一个大的随机整数(比m和n个大很多),那么bigrand()%n返回[0,n-1]范围的随机整数
4)应用:其他应用如从n个城市中选择出m个城市的名字,可以先对城市名进行签名标记为0,1,...,n-1
记住:我们面对的随机函数的输入是0,1,...,n-1,具体应用可以运用签名转换成成对应的0,1,...,n-1
5)如果要按序输出,可以先对操作对象排序,然后签名[0,n-1],这样通过按序访问数,就能保证输出结果是有序的
//重新排列[0,n-1]范围内的数
public int[] knuthShuffle(int[] arr) {
if(arr==null)
return arr;
int randValue;
for (int remaining=arr.length; remaining>=0; remaining--) {
randValue = bigrand()%remaining; //产生[0,remaining-1]范围内的随机数
swap(array[remaining], array[randValue]);
} //end for
return arr;
} //end knuthShuffle
从n个数中随机选择m个数,其中[0,1,...,n-1]代表数的