#include <iostream> using namespace std; // int[] reservoir = new int[m]; // // for (int i = 0; i < reservoir.length; i++) // { // reservoir[i] = dataStream[i]; // } // for (int i = m; i < dataStream.length; i++) // { // // 随机获得一个[0, i]内的随机整数 // int d = rand.nextInt(i + 1); // // 如果随机整数落在[0, m-1]范围内,则替换蓄水池中的元素 // if (d < m) // { // reservoir[d] = dataStream[i]; // } // } // 1.如果接收的数据量小于m,则依次放入蓄水池。 // 2.当接收到第i个数据时,i >= m,在[0, i]范围内取以随机数d,若d的落在[0, m-1]范围内,则用接收到的第i个数据替换蓄水池中的第d个数据。 // 重复步骤2。 // 3.算法的精妙之处在于:当处理完所有的数据时,蓄水池中的每个数据都是以m/N的概率获得的。 int* sample(int arr[] ,int size,int m){ int *v=new int[m]; for(int i=0;i<m;i++) v[i]=arr[i]; for(int i=m;i<size;i++) { int idx=random()%(i+1); if(idx<m){ v[idx]=arr[i]; } } return v; } int main(){ int arr[100]; for(int i=0;i<100;i++) arr[i]=i; int m=10; int *p=sample(arr,100,m); for(int *i=p;i<p+m;i++) cout<<*i<<" "; return 0; } #include <iostream> using namespace std; void swap(void *&a,void *&b){ void *tmp=a; a=b; b=tmp; } void shuffle(int arr[10]){ int len=10; while(len){ int idx=random()%len; cout<<idx<<" "; swap(arr[len-1],arr[idx]); len--; } } int main(){ int a[10]={2,3,6,5,8,9,4,41,10,26}; shuffle(a); for(int i=0;i<10;i++) cout<<a[i]<<" "; return 0; }