random_shuffle
- 隨機重排[first,last)中的數據,有N!中可能,N=last-first,此算法會產生一種均勻分布,任何特定排列順序被選中的幾率為1/N!,版本二是一種特別的function object,當被引數傳進來,傳遞方式是by reference,而不是by value,因為RandomNumberGenerator的重要特點是具有局部狀態,每次被調用時被改變。
- 使用亂數時,能夠明白設定亂數產生器的種子是非常重要的,如果這對程序重要,則使用第二個版本。
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
- 隨機的將[first,last)中的一個取樣結果復制到[ofirst,olast)中,它會復制n個元素,n為min(last-first,olast-ofirst),Input range中的每個元素至多在Output range中出現一次,該結果以均勻方式選出
- 返回值為ofirst+n
- 對於N個元素,忽略元素順序,欲選出n個元素,共有N!/(n!(N-n)!)中方法,本算法會產生均勻分布的結果,任何特定的元素被選出的幾率為n/N,任何特定取樣(不考慮元素順序)幾率為n!(N-n)!/N!
- 第一個版本用內部自定義的亂數產生器,第二個版本用自己定義的function object的亂數產生器
- 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);
- 從[first,last)中隨機的復制元素到[out,out+n)中,他將復制m個元素,此處m為min(last-first,n),Input range中的每個元素至多在Output range中出現一次,該結果以均勻方式選出
- 返回值為out+m
- Input range必須是Forward Iterator,Output range必須是 Output Iterator,所以會保證兩個容器中的相對順序相同