Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 28th, 2012  |  syntax: None  |  size: 0.80 KB  |  hits: 14  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Choose m elements randomly from a vector containing n elements
  2. template<class fwditer>
  3. bidiiter random_unique(fwditer begin, fwditer end, size_t num_random) {
  4.     size_t left = std::distance(begin, end);
  5.     while (num_random--) {
  6.         fwditer r = begin;
  7.         std::advance(r, rand()%left);
  8.         std::swap(*begin, *r);
  9.         ++begin;
  10.         --left;
  11.     }
  12.     return begin;
  13. }
  14.        
  15. struct rangegenerator {
  16.     rangegenerator(int init) : start(init) { }
  17.  
  18.     int operator()() {
  19.         return start++;
  20.     }
  21.  
  22.     int start;
  23. };
  24.  
  25. vector<T> numbers; // this is filled somewhere else
  26.  
  27. vector<int> indices(numbers.size());
  28.  
  29. generate(begin(indices), end(indices), rangegenerator(0));
  30.  
  31. random_shuffle(begin(indices), end(indices));
  32.  
  33. // then take the first n elements of indices and use them as indices into numbers