随机抽样算法

问题描述:

程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。从概率的角度来说,我们希望得到没有重复的选择,其中每个选择出现的概率相等。

void GenerateKnuth(int m,int n)
{
	int t=m;
	for(int i=0;i<n;i++)
		if(Rand(0,n-1-i)<t)//即以t/(n-i)的概率执行下面的语句
		{
			printf("%d\n",i);
			t--;
		}
}

其中Rand(a,b)随机产生[a,b]范围内的一个整数。

上述算法源自Knuth的《计算机程序设计艺术 第2卷 半数值算法》。Knuth 给出了概率上的证明,每个数选中的概率都是m/n,而且恰好选中m个数。

简单验证一下:

第0个数,被选中的概率是


第1个数,被选中的概率是


第2个数,被选中的概率是


。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值