【题目】
给定一个长度为N且没有重复元素的数组arr和一个整数m,实现函数等概率随机打印arr的M个数。
【要求】
相同的数不要重复打印
时间复杂度为O(M),额外空间复杂度为O(1)
可以改变arr数组
【代码】
//从N个数中等概率打印M个数
public static void printRandM(int[] arr, int m) {
if(arr==null||arr.length==0||m<0){
return;
}
m=Math.min(arr.length, m);//防止m取值太大无效
int count=0;
int i=0;
while(count<m){
i=(int)Math.random()*(arr.length-count);//逐步缩小打印范围
System.out.println(arr[i]);//在指定范围内随机打印arr[i]
swap(arr,i,arr.length-count++-1);//打印后将arr[i]换到末尾
}
}
【注意】
很多有关等概率随机的面试题都是用这种和最后一个位置交换的解法。