蓄水池算法
//蓄水池算法
public class CollectionA{
//一个简单的随机函数,决定一件事情做还是不做
public static int rand(int max)
{
return (int)(Math.random()*max)+1;
}
//以k/N的概率进袋子
public static int[]getKNumsRand(int k,int max)
{
if(max<1||k<1)
{
return null;
}
int[]res=new int[Math.min(k,max)];
for(int i=0;i!=res.length;i++)
{
res[i]=i+1; //前k个数直接进袋子
}
for(int i=k+1;i<max+1;i++)
{
if(rand(i)<=k) //决定i进不进袋子
{
res[rand(k)-1]=i; //i随机替掉袋子中的一个
}
}
return res;
}
//打印数组的内容
public static void printArr(int[]arr)
{
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void main(String[]args)
{
int[]arr=getKNumsRand(10,10000);
printArr(arr);
}
}
还没有评论,来说两句吧...