Как мне сгенерировать случайное число от 1 до k, которое не равно n и m в c ++? - PullRequest
0 голосов
/ 09 февраля 2020

если n = 2, m = 3 и k = 5, тогда ответ может быть 1, 4 или 5. данный k всегда больше или равен 3. Если k = 3 и n = 1, m = 3, тогда ответ будет 2.

Ответы [ 4 ]

1 голос
/ 09 февраля 2020

без учета затраченного времени на большие расстояния, это можно считать ответом (но не оптимизированным)

while( true)
{
 random = ( rand() % ( k + 1));
 if( random != n && random != m)
 {
  break;
 }
}
1 голос
/ 09 февраля 2020

Предполагая m n , необходимо рассмотреть четыре случая:

  1. ( m <1 или <em>m > k) и ( n <1 или <em>n > k):

    Просто верните случайное число от 1 до k .

  2. (1 ≤ m ≤ k) и ( n <1 или <em>n > k):

    Генерация случайного числа от 1 до k –1. Если оно равно м , вместо него выведите k .

  3. ( м <1 или <em>м > k) и (1 ≤ n ≤ k):

    Генерирует случайное число от 1 до k –1. Если оно равно n , вместо него выведите k .

  4. (1 ≤ m ≤ k) и ( 1 ≤ n ≤ k):

    Генерация случайного числа от 1 до k –2. Если оно равно m , вместо него выведите k –1, а если оно равно n , вместо этого выведите k .

Если m = n , вы можете просто установить один из них на ноль.

0 голосов
/ 09 февраля 2020

Есть много способов сделать это, и выбор зависит от того, каковы основные требования.

// brute force (assumes that n < m):
int res = rand() % (k - 2) + 1;
if (n <= res) ++res;
if (m <= res) ++res;

// elimination:
int res = rand() % k + 1;
while (res == n || res == m)
    res = rand() % k;

// table lookup:
int results[] = { 1, 2, 3, 5, 6, 8 }; // n == 4, m == 7
int res = rand() % (sizeof results / sizeof *results);
res = results[res];

Я бы, вероятно, go с подходом грубой силы; это всегда работает, если вы знаете относительный порядок n и m. Более сложная версия будет проверять, какая из них меньше, и при необходимости поменять их местами так, чтобы n было меньше m.

. Исключение также всегда корректно, а когда k велико, l oop будет выполняться редко, поэтому может быть немного быстрее, чем грубая сила. Когда k мало, оно может l oop много раз. Этот подход иногда используется при создании более сложных распределений, таких как пара координат, которые находятся внутри круга (сгенерируйте две координаты и, если они находятся вне круга, отбросьте их и попробуйте снова).

Поиск в таблице вероятно, это не лучший выбор, но если вы знаете значения k, n и m во время компиляции, он может быть немного быстрее, чем любой из двух других. Конечно, при больших значениях k много пустого места.

0 голосов
/ 09 февраля 2020

В C ++ rand () создает псевдослучайную коллекцию «случайных» чисел. Поэтому я рекомендую установить начальное значение с помощью srand (...). Для другого решения:

int main()
{
    // Generetes random seed for psudo random numbers.
    srand (1234);

    // Initialze variables
    int n, m, k, random;

    // Read in values
    std::cout << "Enter n:  ";
    cin >> n;
    std::cout << "Enter m:  ";
    cin >> m;
    std::cout << "Enter k:  ";
    cin >> k;

    // Generates a random number
    do {
        random = rand()% k + 1; // Random number from 1 to k
    }
    // Repeat if the random number is equal to n or m
    while (random == n || random == m);

    // The value
    cout<<"Number generated: " <<random<<"\n";


    return 0;
}
...