random_sample和random_sample_n

random_sample

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);
  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中的顺序相同

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,所以会保证两个容器中的相对顺序相同

猜你喜欢

转载自www.cnblogs.com/tianzeng/p/10388694.html