fork download
  1. #include <random> // für zufallszahlen und verteilung
  2. #include <algorithm> // für swap (und copy bei der ausgabe)
  3. #include <unordered_set> // für random_sample
  4. #include <iostream> // nur für ausgabe
  5. #include <iterator> // nur für ausgabe
  6.  
  7. // O(k), aber die Werte müssen schon im Speicher sein.
  8. template <typename RandomIt, typename URNG>
  9. void partial_shuffle(RandomIt first, RandomIt mid, RandomIt last, URNG&& g) {
  10. auto n = last - first;
  11. auto k = mid - first;
  12. for (decltype(n) i{}; i < k; ++i) {
  13. auto j = std::uniform_int_distribution<decltype(i)>(i, n - 1)(g);
  14. using std::swap;
  15. swap(first[i], first[j]);
  16. }
  17. }
  18.  
  19. // O(k) sofern k viel kleiner wie n
  20. template <typename Distribution, typename OutIt, typename URNG>
  21. void random_sample(Distribution&& pool, std::size_t k, OutIt out, URNG g) {
  22. std::unordered_set<decltype(pool(g))> sample;
  23. while (sample.size() < k) {
  24. auto elem = pool(g);
  25. if (sample.insert(elem).second)
  26. *out++ = std::move(elem);
  27. }
  28. }
  29.  
  30. int main()
  31. {
  32. std::vector<int> v(100);
  33. std::iota(v.begin(), v.end(), 1);
  34. partial_shuffle(v.begin(), v.begin()+10, v.end(),
  35. std::mt19937());
  36. std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
  37.  
  38. std::cout << '\n';
  39.  
  40. random_sample(std::uniform_int_distribution<int>(1, 100),
  41. 10,
  42. std::ostream_iterator<int>(std::cout, " "),
  43. std::mt19937());
  44. }
Success #stdin #stdout 0s 3276KB
stdin
Standard input is empty
stdout
82 15 91 84 17 98 92 28 67 38 11 12 13 14 2 16 5 18 19 20 21 22 23 24 25 26 27 8 29 30 31 32 33 34 35 36 37 10 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 9 68 69 70 71 72 73 74 75 76 77 78 79 80 81 1 83 4 85 86 87 88 89 90 3 7 93 94 95 96 97 6 99 100 
82 14 91 84 13 97 92 23 64 31