随机流取m个数(旅行家)

给定一个未知长度的整数流,如何从中随机选取个m随机数。

 

解决方法:

定义长度为m的数组,对于数据流中的前1000个关键字,显然都要放到数组中。

对于数据流中的的第nn>m)个关键字,则这个关键字被随机选中的概率为 m/n。故以 m/n 的概率用这个关键字去替换数组中的一个。这样就可以保证所有关键字都以 m/n的概率被选中。对于后面的关键字都进行这样的处理,这样就可以保证数组中总是保存着m个随机关键字。


可以用归纳法证明关键字都以 m/n的概率被选中。



void swap(int* p, int* q)
{
int tmp = *p;
*p = *q;
*q = tmp;
}
void shuffle(int *arr, int n)
{
int i;
for(i = 0; i < n; i++) {
int idx = rand() % (i + 1); //选取互换的位置
swap(&arr[idx], &arr[i]);
}
}



posted @ 2011-10-07 22:10  westfly  阅读(373)  评论(0编辑  收藏  举报