Как выбрать между двумя значениями случайным образом? - PullRequest
1 голос
/ 01 февраля 2020

Я пытаюсь случайным образом выбрать одно из двух чисел: 2 или -2. Есть ли способ сделать это? Я пытаюсь реализовать алгоритм для создания лабиринта.

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

У вас есть rand() из стандартной библиотеки C, которая возвращает псевдослучайное целое число в диапазоне [0, RAND_MAX]. Вы можете использовать эту функцию и выбрать одно из двух чисел, проверяя, является ли возвращаемое значение выше или ниже RAND_MAX/2.

Сначала используйте srand() для инициализации псевдослучайного числа генератор с небольшим количеством семян. Обычно для этого используется time(), поскольку он каждый раз возвращает различное значение.

srand(time(NULL));

int rnd = rand();
int result = (rnd > RAND_MAX/2) ? 2 : -2;

В качестве альтернативы можно использовать младший значащий бит значения, возвращаемого rand() , как предложено в этом другом ответе , поскольку половина возвращаемых значений нечетная, а половина четная:

int result = (rnd & 1) ? 2 : -2;
1 голос
/ 01 февраля 2020

Есть много способов сделать это, мой любимый:

a + rand() % 2 * (b - a);

, но это не ясно что он делает, и это не способствует эффективность либо (хорошо, если вы превратили бы ее в макро / встроенную функцию и никогда не использовали бы с переменными, современные компиляторы должны оценивать числа во время компиляции), поэтому самый элегантный способ сделать это - использовать некоторые Тип условия, вот пример с троичным оператором:

(rand() % 2)? a: b;

Кстати: есть много способов выбора между 0/1, я использовал rand ()% 2, потому что это наиболее используемая техника, но если вы случилось так, что для архитектуры 6502, где нет модуля / деления, вы можете сделать это с помощью побитового оператора, например rand () & ANY_POWER_OF_TWO или вот так rand ()> HALF_MAX_RAND

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

Вы можете использовать это. Он использует побитовые операции для генерации 2 или -2 без ветвления:

-((rand() & 1) << 2) + 2

Я отмечаю, что вы должны использовать srand() для заполнения генератора случайных чисел перед его использованием ; Я обычно использую srand(time(NULL)).

Шаг за шагом:

  • (rand() & 1) генерирует случайное число: либо 0, либо 1.

  • << 2 умножает предыдущий результат на 4, а - перед -((rand() & 1) << 2) отрицает это, поэтому результат либо 0, либо -4.

  • + 2 добавляет 2, поэтому результат будет либо 2 или -2.

Если вы хотите см. более арифметический c -подобный подход, которому легче следовать, вот он:

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