fork download
  1. #include <iostream>
  2. #include <random>
  3. #include <algorithm>
  4. #include <ctime>
  5. #include <map>
  6.  
  7. struct Range
  8. {
  9. int min;
  10. int max;
  11. };
  12.  
  13. template <typename... T>
  14. struct and_
  15. : std::true_type
  16. {};
  17.  
  18. template <typename First, typename... Other>
  19. struct and_<First, Other...>
  20. : std::integral_constant<bool, First::value && and_<Other...>::value>
  21. {};
  22.  
  23. template < typename ...RangeT
  24. , typename = typename std::enable_if<
  25. (and_<
  26. std::is_same<RangeT, Range>...
  27. >::value) && (sizeof...(RangeT) > 0)
  28. >::type
  29. >
  30. int random(std::mt19937 & mt, RangeT const & ...args)
  31. {
  32. int sum = 0;
  33. struct MRange
  34. {
  35. const int min, max;
  36. const int distance;
  37.  
  38. MRange(int min, int max, int & sum)
  39. : min(min), max(max), distance(std::abs(min - max))
  40. {
  41. sum += distance;
  42. }
  43. } const ranges[] =
  44. {
  45. MRange(args.min, args.max, sum)...
  46. };
  47. int index = std::uniform_int_distribution<int>(0, sum)(mt);
  48.  
  49. int ret = ranges[0].min + index;
  50. if(ret > ranges[0].max)
  51. {
  52. index -= ranges[0].distance;
  53. for(size_t i = 1; i < sizeof...(args); ++i)
  54. {
  55. ret = ranges[i].min + index;
  56. if(ret > ranges[i].max)
  57. {
  58. index -= ranges[i].distance;
  59. }
  60. else
  61. {
  62. break;
  63. }
  64. }
  65. }
  66. return ret;
  67. }
  68. int main()
  69. {
  70. std::mt19937 mt(static_cast<unsigned>(std::time(nullptr)));
  71.  
  72. std::map<int, int> m;
  73. for(size_t n = 0; n < 10000; ++n)
  74. {
  75. ++m[random(mt, Range{ 0, 2 }, Range{ 50, 100 })];
  76. }
  77. for(auto p : m)
  78. {
  79. std::cout << p.first << " generated " << p.second << " times\n";
  80. }
  81. }
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
0 generated 196 times
1 generated 193 times
2 generated 181 times
51 generated 180 times
52 generated 207 times
53 generated 166 times
54 generated 211 times
55 generated 190 times
56 generated 175 times
57 generated 177 times
58 generated 215 times
59 generated 216 times
60 generated 193 times
61 generated 172 times
62 generated 179 times
63 generated 194 times
64 generated 169 times
65 generated 184 times
66 generated 196 times
67 generated 180 times
68 generated 190 times
69 generated 194 times
70 generated 185 times
71 generated 186 times
72 generated 190 times
73 generated 182 times
74 generated 164 times
75 generated 196 times
76 generated 195 times
77 generated 190 times
78 generated 196 times
79 generated 193 times
80 generated 179 times
81 generated 185 times
82 generated 209 times
83 generated 183 times
84 generated 183 times
85 generated 160 times
86 generated 204 times
87 generated 209 times
88 generated 200 times
89 generated 204 times
90 generated 186 times
91 generated 193 times
92 generated 175 times
93 generated 203 times
94 generated 202 times
95 generated 188 times
96 generated 169 times
97 generated 190 times
98 generated 174 times
99 generated 201 times
100 generated 168 times