Проблема выбора случайного числа в пределах диапазона - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть этот код:

cin >> command;
if (command[0] == 'R' or command[0] == 'r') {
    if (command[1] == 'o' and command[3] == 'l' and command[2] == 'l') {
        if (command[4] == '\0') {
            cout << rand()+ 1 << endl;
        } 
        else if (command[5] == '\0')
        {
            NumberName = command[4];
            cout << (rand()%NumberName)+ 1 << endl;
        }
        else if (command[6] == '\0')
        {
            NumberName = command[4] + command[5];
            cout << (rand()%(NumberName))+ 1 << endl;
        }
    }
}

При запуске он генерирует случайные числа вне диапазона.

command - это массив с пределом 30.

NumberName это просто обычный int.

Я ввожу roll10 в консоли, и он возвращает 90, затем 34, затем 51, вы понимаете.

1 Ответ

0 голосов
/ 04 апреля 2020

Пожалуйста не используйте rand() и в частности не используйте % для сокращения до диапазона, поскольку это приводит к неравномерному распределению.

Стандартная библиотека C ++ специально для этого имеет тип uniform_int_distribution. Используйте это с mt19937 для генерации псевдослучайных чисел:

std::uniform_int_distribution<unsigned> dis(min, max);
std::mt19937 gen(seed);
auto const randomnumber = dis(gen);

В вашем примере вы, вероятно, получите неожиданный диапазон, потому что символ '7' (например) не равен числу 7. Возможно, вы захотите использовать character[4]-'0' в качестве максимального значения.

Когда вы вводите roll10, это переводится в последнюю ветвь вашего условия, что означает, что у вас есть числовое значение для '1' плюс числовое значение значение для '0', которое равно 48 + 49 = 97. Таким образом, x%97 + 1 учитывает все значения в [1..97] с почти, но не совсем равномерным распределением.

Возможно, вы ищете что-то вроде это:

auto const max = static_cast<unsigned>(command[4]-'0')*10 + static_cast<unsigned>(command[5]-'0');
auto const randomnumber = std::uniform_int_distribution<unsigned>(1, max)(gen);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...