2012-05-09 2 views
0

Я хочу выбрать случайным образом из числа 4-х направлениях:Выберите одно из 4-х случайных направлений с помощью rand()?

movePlayer(map, &positionPlayer, direction); 

где направление является одним из UP, DOWN, LEFT и RIGHT.

Я еще не узнал, как это сделать с помощью функции rand().

Как я могу это сделать? Нужно ли мне назначать число в каждом направлении, а затем выбирать случайное число в пределах этих границ?

Благодарим за помощь.

+4

Использование перечисления для направления помогает. – chris

+0

Эти направления уже перечислены, каков следующий шаг? –

ответ

4

Самый простой способ сделать это, чтобы просто сделать модуло функции рандов, чтобы получить число от 0 до 3 (включительно).

int x = rand() % 4; 

Тогда вы можете просто выполнить переключатель заявление выбрать направление

switch(x) 
{ 
    case 0: 
     movePlayer(map, &positionPlayer, UP); 
     break; 

    case 1: 
     movePlayer(map, &positionPlayer, DOWN); 
     break; 

    case 2: 
     movePlayer(map, &positionPlayer, LEFT); 
     break; 

    case 3: 
     movePlayer(map, &positionPlayer, RIGHT); 
     break; 
} 

Конечно, это не будет точно случайным образом с совершенным distrubition (модуль несколько рубить).

Если вам нужна настоящая случайность с фактическими распределениями, вы можете захотеть заглянуть в Boost.Random.

+2

Как это проще всего? Это будет одна строка с перечислением и литой. – Pubby

+0

@Pubby: инструкция 'switch', как это, может существовать _somewhere _... – sarnold

+0

Это работает, спасибо всем –

6

Да, вам нужно назначить номер в каждом направлении. т.е. 0 = UP 1 = DOWN 2 = ЛЕВЫЙ 3 = RIGHT Вам нужно такой код:

int direction = rand()%4; 
+0

Вот где перечисление пригодится. – chris

2

Если direction это перечисление:

enum Direction { 
    UP, 
    DOWN, 
    LEFT, 
    RIGHT 
} direction; 

В C/C++, константы перечисления представлены в виде целых чисел. Первое значение, UP, соответствует 0, DOWN равно 1 и так далее.

Таким образом, вы можете просто позвонить:

movePlayer(map, &positionPlayer, static_cast<Direction>(rand() % 4)); 

, который будет вызывать movePlayer со случайно выбранным значением направления.

Не всегда целесообразно использовать оператор модуля для сужения диапазона rand(). Если вам нужно что-то с более равномерным распределением, вы должны посмотреть на это other methods.

+0

Я использую кодовые блоки и C: error: 'static_cast' uneclared (первое использование в этой функции) | –

+3

Почему вопрос с тегом C++, если вы не используете C++? – Wiz

+0

@capslock, если вы используете C, '(Diection) (rand()% 4)' должно хватить. – chris

1

rand() не обязательно очень хорошо. <random>, вероятно, лучший вариант.

C++ 11:

#include <random> 
#include <iostream> 

enum Direction : char { 
    north, east, south, west 
}; 

std::ostream &operator<< (std::ostream &os, Direction d) { 
    switch (d) { 
    case Direction::north : return os << "North"; 
    case Direction::east : return os << "East"; 
    case Direction::south : return os << "South"; 
    case Direction::west : return os << "West"; 
    } 
} 

std::uniform_int_distribution<Direction> random_direction 
    {Direction::north, Direction::west}; 

int main() { 
    // you can use any of several different sources of random values depending on your needs 
    std::mt19937 eng; 
    for (int i=0;i<10;++i) 
    std::cout << random_direction(eng) << '\n'; 
} 

Если вы не хотите направления быть неявно преобразованы в Int вы можете использовать enum class и другое определение для random_direction:

template<typename Engine> 
Direction random_direction(Engine &&eng) { 
    std::uniform_int_distribution<> dist 
    {int(Direction::north),int(Direction::west)}; 
    return Direction(dist(std::forward<Engine>(eng))); 
} 
0

A лучшим способом является вызов srand (time (0)) перед rand()% 4. Это гарантирует, что каждый раз, когда вы выполняете свою программу, генерируется другой набор случайных чисел. Вызов rand() без srand() будет генерировать одинаковый набор случайных чисел каждый раз, когда программа выполняется.