Создайте два случайных числа, чтобы одно всегда было больше другого - PullRequest
1 голос
/ 18 марта 2020

Я выполняю стресс-тестирование для следующей задачи моей функции myFunc().

Существует каменный мост, соединяющий два города. Первый камень, начинающийся с одного города, имеет 1 надписью, а последний камень находится на другой стороне города. Каждый последующий камень имеет два последовательных числа на нем, кроме последнего камня, на котором может быть написано одно или два числа в зависимости от значения N. Камни могут быть выровнены как 1, (2, 3), (4, 5), ( 6, 7) ... N.

Вам дается число N, представляющее последнее число на последнем камне; и число X. Задача состоит в том, чтобы найти минимальное количество прыжков, которое вам нужно, либо с первой стороны города, либо со второй стороны города, чтобы добраться до камня, на котором написано X. Примечание. Прыжок на первом камне будет засчитан как 0 прыжков.

Пример: Вход: 2 10 3 5 1

Выход: 1 0

Объяснение: Контрольный пример 1: Выравнивание камней для N = 10 выглядит следующим образом: 1, (2, 3), (4, 5), (6, 7), (8, 9), 10 Чтобы прыгнуть на X = 3, вам нужен только один прыжок ( так как первый каменный прыжок не будет засчитан) со стороны Первого города и 4 прыжка со второй стороны. Таким образом, минимум 1 и 4 равен 1.

Тестовый пример 2: выравнивание камней для N = 5 выглядит следующим образом: 1, (2, 3), (4, 5) Чтобы перейти на X = 1, вы нужны только нулевые прыжки (так как первый каменный прыжок не будет учитываться) со стороны первого города и 2 прыжка со стороны второго города. Таким образом, минимум 0 и 2 равен 0.

#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;

int myFunc(int n, int p) {
    return p / 2;
}

int findJumps(int n, int p){
    return min(X /2, (N / 2) - (X / 2));
}
int main() {
    int n, x;
    srand(time(0));
    while(true) {

        n = rand() % 40 + 1; // I want n to be always greater than x
        x = rand() % 40 + 1;
        if(myFunc(n, x) != findJumps(n, x)) {
            cout << n << " " << x;
            break;
        }

        else cout << n << " " << x;
        cout << endl;
    }
    return 0;
}

Я хочу, чтобы мой код генерировал N всегда больше X в бесконечной области действия l oop. Как я могу применить это условие?

Ответы [ 2 ]

4 голосов
/ 18 марта 2020

Позвольте мне начать с рекомендации, что вы должны избегать использования rand (вообще) и % для ограничения его выхода определенным диапазоном. В любом случае, если вы действительно настаиваете на этом, перейдите к разделу C Библиотека ниже, чтобы найти способ, по крайней мере, полудумный.

Современная библиотека

C ++ 11 представил новый набор классов для генерации случайных чисел и уменьшения случайных чисел до заданного диапазона. Однако использовать их - смешанный пакет - некоторые части (например, посевные) немного сложнее, в то время как другие (например, сокращение до диапазона) несколько проще - по крайней мере, если вы хотите хорошо выполнять свою работу.

Я бы также отметил, что если 0 n должен быть 2, а не 1.

Используя классы генерации случайных чисел в C ++ 11, вы можете сделать что-то в таком общем порядке:

std::mt19937 gen{ std::random_device()() };

// ...

int n = std::uniform_int_distribution<int>(2, 40)(gen);
int x = std::uniform_int_distribution<int>(1, n)(gen);

Если вы действительно заботитесь о качестве случайных чисел, вы можете захотеть go немного дальше, хотя - прямо сейчас, это использует только одно возвращаемое значение из std::random_device для заполнения генератора, но генератор mt19937 на самом деле имеет гораздо большее состояние, чем это, поэтому большее начальное число будет лучше. Если вы хотите разобраться в этом, вы можете рассмотреть std::seed_seq в качестве отправной точки.

C Библиотека

Если вы собираетесь используйте rand() и %, чтобы уменьшить ваши числа до нужного диапазона, я думаю, я бы начал с написания небольшой функции для генерации случайного числа в указанном диапазоне 1 :

int rand_range(int lower, int upper) { 
    int range = upper - lower;

    return rand() % range + lower;
}

Тогда я бы использовал это для генерации чисел:

n = rand_range(2, 40);
x = rand_range(1, n);

[Как указано выше, нижний предел для n должен быть равен 2.]

Другая возможность будет чтобы сгенерировать два числа, тогда, если они в неправильном порядке, поменяйте их местами. Это все еще оставляет возможность того, что они равны, и устранение этой возможности было бы большим трудом - таким образом, предыдущий совет просто убедиться, что когда вы генерируете x, он всегда начинается строго меньше чем n.


1. Обратите внимание, что если диапазон rand() не кратен 40 (что маловероятно), использование %, как это, приводит к смещенным результатам , Если вы хотите добиться большего, вы можете взглянуть на { ссылка }, чтобы найти несколько улучшенный метод, но стандартный дистрибутив, показанный в разделе Modern Library , действительно является правильным способом go здесь.

1 голос
/ 18 марта 2020

Как отметил Марк Рэнсом, одним простым и хорошим решением, с которым я столкнулся, является эта простая проверка if(x > n) swap(n, x).

Итак, код драйвера может выглядеть так:

int main() {
int n, x;
srand(time(0));
while(true) {

    n = rand() % 40 + 1; // I want n to be always greater than x
    x = rand() % 40 + 1;
    if(x > n) swap(n, x);
    if(myFunc(n, x) != findJumps(n, x)) {
        cout << n << " " << x;
        break;
    }

    else cout << n << " " << x;
    cout << endl;
}
return 0;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...