@avion123678

Область генерации ПСЧ в С++?

Как сделать, чтобы область генерации была, к примеру, от 1 до 10, не включая 3?
mt19937 gen(time(0));
uniform_int_distribution<int> uid(1, 10);
  • Вопрос задан
  • 71 просмотр
Пригласить эксперта
Ответы на вопрос 2
Допустим вам нужен диапазон S1 = [0, k) | (k, N].
Используйте распределение в диапазоне S2 = [0, N - 1]. А затем результат преобразуйте с помощью отображения f: S2 -> S1.

В вашем случае f это функция:

f(x) = if (x >= 3) x + 1 else x

mt19937 gen(time(0));
uniform_int_distribution<int> uid(1, 9);

int f(int n) {
  if (n >= 3)
    return n + 1;
  else
    return n;
}

int i = f(uid(gen));
Ответ написан
Комментировать
BacCM
@BacCM
C++ почти с рождения
Я вижу два варианта:
- генерировать число проверять не равно ли "3" или не находится ли в области "3" и перегенерировать по необходимости. всё это в цикле.
-- подвариант первого варианта, сразу нагенерировать большую последовательность и N элементов, а когда оттуда будешь их брать пропускать невалидные, как кончилась или есть свободное время у процесса догенерить новых
- и второй вариант. Случайно выбирать поддиапазон [1, 3) или (3,10], учитывая что они разного размера и уже в нём получать число.

Второй вариант дает постоянное время работы, хотя и с большим средним.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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