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

本文探讨了如何从集合A中等概率地选取m个元素的方法,并提供了详细的数学证明过程及Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想法:假设我们有一个集合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个数即为随机数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值