shuffle算法

shuffle算法应用很多,比如n个元素里面随机抽取m个元素,最重要的特性就是我们要保证每个位置上出现任意一个数的概率都是1/n


void shuffle(vector&arr)
{
	for (int i=arr.size()-1;i>=0;--i)
	{
		swap(arr[rand()%(i+1)],arr[i]);
	}
}

对于arr[i],洗牌后在第n-1个位置的概率是1/n(第一次交换的随机数为i)
在n-2个位置概率是[(n-1)/n] * [1/(n-1)] = 1/n,(第一次交换的随机数不为i,第二次为arr[i]所在的位置(注意,若i=n-1,第一交换arr[n-1]会被换到一个随机的位置))
在第n-k个位置的概率是[(n-1)/n] * [(n-2)/(n-1)] [(n-k+1)/(n-k+2)] *[1/(n-k+1)] = 1/n

你可能感兴趣的:(shuffle算法)