隨機重拍與抽樣(random_shuffle,random_sample,random_sample_n)


random_shuffle

  1. 隨機重排[first,last)中的數據,有N!中可能,N=last-first,此算法會產生一種均勻分布,任何特定排列順序被選中的幾率為1/N!,版本二是一種特別的function object,當被引數傳進來,傳遞方式是by reference,而不是by value,因為RandomNumberGenerator的重要特點是具有局部狀態,每次被調用時被改變。
  2. 使用亂數時,能夠明白設定亂數產生器的種子是非常重要的,如果這對程序重要,則使用第二個版本。
template <class RandomAccessIterator>                                             
inline void random_shuffle(RandomAccessIterator first, RandomAccessIterator last)
{ 
    if(first != last)                                                             
        for(RandomAccessIterator i = first + 1; i != last; ++i)                   
            iter_swap(i, first + (rand() % ((i - first) + 1)));                   
} 
inline void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,RandomNumberGenerator& rand)//by reference

random_sample

  1. 隨機的將[first,last)中的一個取樣結果復制到[ofirst,olast)中,它會復制n個元素,n為min(last-first,olast-ofirst),Input range中的每個元素至多在Output range中出現一次,該結果以均勻方式選出
  2. 返回值為ofirst+n
  3. 對於N個元素,忽略元素順序,欲選出n個元素,共有N!/(n!(N-n)!)中方法,本算法會產生均勻分布的結果,任何特定的元素被選出的幾率為n/N,任何特定取樣(不考慮元素順序)幾率為n!(N-n)!/N!
  4. 第一個版本用內部自定義的亂數產生器,第二個版本用自己定義的function object的亂數產生器
  5. Input range必須是Forward Iterator,Output range必須是RandomAccessIterator,所以Output range中元素的性對順序不一定會與Input ragne中的順序相同
template <class InputerIterator,class RandomAccessIterator>
RandomAccessIterator random_sample(InputerIterator first,InputIterator last,RandomAccessIterator ofirst,RandomAccessIterator olast);

template <class InputerIterator,class RandomAccessIterator>
RandomAccessIterator random_sample(InputerIterator first,InputIterator last,RandomAccessIterator ofirst,RandomAccessIterator olast,RandomNumberGenerator &rand);

random_sample_n

template <class InputerIterator,class OutputerIterator,class Distance>
OutputerIterator random_sample_n(InputerIterator first,InputIterator last,OutputerIterator out,Distance n);

template <class InputerIterator,class OutputerIterator,class Distance,class RandomNumberGenerator>
OutputerIterator random_sample_n(InputerIterator first,InputIterator last,OutputerIterator out,Distance n,RandomNumberGenerator &rand);
  1. 從[first,last)中隨機的復制元素到[out,out+n)中,他將復制m個元素,此處m為min(last-first,n),Input range中的每個元素至多在Output range中出現一次,該結果以均勻方式選出
  2. 返回值為out+m
  3. Input range必須是Forward Iterator,Output range必須是 Output Iterator,所以會保證兩個容器中的相對順序相同


免責聲明!

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



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