fork(3) download
  1. #include <iostream>
  2. #include <random>
  3. #include <vector>
  4.  
  5. namespace
  6. {
  7. std::random_device rd;
  8. std::mt19937 eng{ rd() };
  9. std::uniform_real_distribution<> dist; // [0,1)
  10. double my_rand() { return dist(eng); }
  11. }
  12.  
  13. // Programming Pearls column 11.2
  14. // Knuth's algorithm S (3.4.2)
  15. // output M integers (in order) in range 1..N
  16. template <typename OutIt>
  17. void knuth_s(int M, int N, OutIt dest)
  18. {
  19. double select = M, remaining = N;
  20. for (int i = 1; i <= N; ++i) {
  21. if (my_rand() < select / remaining) {
  22. *dest++ = i;
  23. --select;
  24. }
  25. --remaining;
  26. }
  27. }
  28.  
  29. int main()
  30. {
  31. std::vector<int> data;
  32.  
  33. knuth_s(20, 200, back_inserter(data)); // 20 values in [1,200]
  34.  
  35. for (auto value : data) {
  36. std::cout << value << ' ';
  37. }
  38. }
  39.  
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
17 23 32 35 54 58 60 68 72 93 104 109 117 142 143 146 147 174 186 192