思路:如果n个数本身是随机的,那么直接输出头m个数即可;但事实上并不知道这n个数本身是不是随机排列,所以可以用某种方法让前面m个数变成随机的,然后直接输出前m个数。方法即是产生随机数random,然后将a[random]与前面的a[i]交换,i为0、1、2……m。比如第一次,是将a[random]与a[0]交换,第二次是将a[random]与a[1]交换……最后一次是将a[random]与a[m]交换。还有一个问题,产生随机数的范围应当改变,这是为了满足等概率的要求。第一次随机数的范围为0~n-1,第二次随机数的范围应当为1~n-1,第三次应当为2~n-1,这就相当于每挑选出一个数就把它移除然后从剩下的数中挑选下一个,这是符合等概率的,否则依然在所有的数中挑选会出现同一个数重复挑选的问题。
1 void func(vector<int> vec, int n,int m) 2 { 3 int random; 4 srand(time(NULL)); 5 for (int i = 0; i < m; i++) 6 { 7 random = (rand() % (n - i)) + i;//产生i~n-1范围的随机数 8 swap(vec[i], vec[random]); 9 cout << vec[i] << " "; 10 } 11 }
原文:https://www.cnblogs.com/cs0915/p/12840139.html