Задать вопрос
@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;
}


Реализовал только ограничение на первую цифру, как сделать чтобы было ограничение на все, минимум и максимум могут изменяться и иметь разную длину.
  • Вопрос задан
  • 126 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 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: тут все возможные числа не будут равновероятны. Чтобы они были равновероятны придется хорошенько поизвращаться.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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