@Sunter

Как сделать ограничение максимума и минимума в генерации случайных чисел с помощью строк?

#include <iostream>
#include <string>
#include <cstdlib>
#include <time.h>
int main() {

    string value = "";
    string maximum = "4294967296";
    string minimum = "2147483649";
    srand(time(NULL));
    value = "";
    while (value.length() < maximum.length())
    {
        if (value.length() == 0)
        {
            value+=to_string(rand() % ( (maximum[0]-'0')  - (minimum[0] - '0') +1) + (minimum[0] - '0'));
        }
        value+= to_string(rand() % 10);
   }
    cout<<value<<endl;
    return 0;
}


Реализовал только ограничение на первую цифру, как сделать чтобы было ограничение на все, минимум и максимум могут изменяться и иметь разную длину.
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Во-первых, дополните минимум нулями слева, чтобы две строки были одинаковой длины.

Потом генерируйте посимвольно, считая, какие значения текущая цифра может принимать. Смотрите, если где-то вы сгенерируете цифру меньше maximum, то дальше может быть вообще что угодно. Ваше сгенеренное число уже меньше максимума. Так же с минимумом. Поэтому, поддерживайте 2 флага: "сгенрированная строка уже меньше максимума" и "сгенерированная строка уже больше минимума". Каждый следующий символ не должен превосходить цифру в максимуме, если не первый флаг. Также он не должен быть меньше минимума, если не второй флаг.

Что-то вроде этого:
bool smaller_than_max = false;
bool bigger_than_min = false;
for (int i = 0; i < n; ++i) {
   int left = bigger_than_min ? '0' : minimum[i];
   int right = smaller_than_max ? '9' : maximum[i];
   answer[i] = left + rand() % (right - left + 1);
   bigger_than_min |= answer[i] > minimum[i];
   smaller_than_max |= answer[i] < maximum[i];
}


Edit: тут все возможные числа не будут равновероятны. Чтобы они были равновероятны придется хорошенько поизвращаться.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы