您的位置:首页 > 其它

从i到j(i<j)中随机取n个数的随机算法

2014-01-09 14:57 169 查看
想法:假设我们有一个集合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个数即为随机数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐