Как выбрать случайный элемент в станд.:: набор?

Как я могу выбрать случайный элемент в std::set?

Я наивно попробовал это:

int GetSample(const std::set<int>& s) {
  double r = rand() % s.size();
  return *(s.begin() + r); // compile error
}

Но operator+ не позволяется таким образом.

29
задан Frank 16 June 2010 в 11:26
поделиться

2 ответа

Вы можете использовать метод std::advance.

#include <set>
#include <algorithm>

int main() {
  using namespace std;
  // generate a set...
  set<int> s;
  for( int i = 0; i != 10; ++i ) s.insert(i);
  auto r = rand() % s.size(); // not _really_ random
  auto n = *select_random(s, r);
}

Где

template<typename S>
auto select_random(const S &s, size_t n) {
  auto it = std::begin(s);
  // 'advance' the iterator n times
  std::advance(it,n);
  return it;
}
44
ответ дан 28 November 2019 в 01:38
поделиться
int GetSample(const std::set<int>& s) {
  double r = rand() % s.size();
  std::set<int>::iterator it = s.begin();
  for (; r != 0; r--) it++;
  return *it;
}

было бы одним из способов сделать это, хотя и не очень;

1
ответ дан 28 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: