想法:假设我们有一个集合A(a_1,…,a_n), 对于数m,0≤m≤n, 如何从集合A中等概率地选取m个元素呢?
通过计算古典概率公式可以得到, 每个元素被选取的概率为m/n,即为抽签概率
简单证明:
设两个元素(2<=m<=n),概率p
1) 设p(a_i=1)表示a_i被选中的概率。显而易见, p(a_1=1)=m/n, p(a_1=0)为(n-m)/n;
2)第二个元素被选中的概率为
p(a_2=1)= p(a_2=1,a_1=1)+p(a_2=1,a_1=0)
= p(a_1=1)*p(a_2=1│a_1=1)+ p(a_1=0)* p(a_2=1│a_1=0)
= m/n * (m-1)/(n-1) + (n-m)/n*m/(n-1)
= m/n
java代码实现:
public void getRandomIntegers(int low, int high, int count){
if(count > high - low) return;
int size = high-low+1;
int [] m = new int[size];
for(int i=0;i<size;++i){
m[i] = low+i;
}
Random r = new Random();
for(int i=0;i<count;++i){
int randomIndex = r.nextInt(size-1)%(size-i)+i;
int t = m[randomIndex];
m[randomIndex] = m[i];
m[i] = t;
}
}
m数组中前COUNT个数即为随机数