從n個數中等概率取出m個數


思路:如果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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM