Форум программистов, компьютерный форум CyberForum.ru

Rand() - C++

Восстановить пароль Регистрация
 
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
05.04.2014, 09:46     Rand() #1
C++
1
2
3
4
5
 metka:
          r1=rand()%2;
          r2=rand()%2;
          if(r1==a && r2==b)goto metka;
          else arr[r1][r2]=='O';
Собсно-это кусок кода "крестиков-ноликов".Перед этим куском кода,пользователь вводит первый "крестик".Поэтому ИИ тоже предстоит поставить первый "нолик",но так как он первый,то он ставит его рандомно.
Поэтому переменным r1 и r2 присваиваются рандомные значения от 0 до 2(массив[3][3]).Потом идёт сравнение "нолика" с координатами первого введённого "крестика",и если они совпадают,то координаты "нолика" создаются снова,пока буду отличны от координат "крестика".
Собсно,зачем я пишу сюда.Программа не выводит введённый программой "нолик",хотя все остальные элементы выводятся правильно.Мне кажется,что ошибка где-то с функцией rand()

C++
1
2
r1=rand()%2;
r2=rand()%2;
Подскажите,вообще синтаксис этих строк верен?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2014, 09:46     Rand()
Посмотрите здесь:

C++ rand()
rand C++
rand C++
rand() C++
C++ rand от 1 до 16
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
05.04.2014, 09:49     Rand() #2
Цитата Сообщение от Игорюня Посмотреть сообщение
Поэтому переменным r1 и r2 присваиваются рандомные значения от 0 до 2
Цитата Сообщение от Игорюня Посмотреть сообщение
r1=rand()%2;
Присваивает значения 0 и 1
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
05.04.2014, 09:49     Rand() #3
Цитата Сообщение от Игорюня Посмотреть сообщение
r1=rand()%2;
Тут минимум - 0, максимум - 1.

Сам алгоритм так себе... Можно за один вызов rand поставить знак в гарантировано свободную ячейку при желании.
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
05.04.2014, 09:54  [ТС]     Rand() #4
Подскажите,как одним вызовом указатель столбец и строку.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
05.04.2014, 10:03     Rand() #5
Грубо говоря, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <algorithm>
#include <iostream>
#include <vector>
 
typedef std::pair<int, int> CellCoordinates;
 
int main()
{
    std::vector<CellCoordinates> cells;
    
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            cells.emplace_back(i, j);
        }
    }
    
    for (int i = 0, size = cells.size(); i < 9; ++i, --size) {
        std::cout << "Cells left: " << size << std::endl;
        
        int index = rand() % (size + 1);
        CellCoordinates cell = cells[index];
        
        std::cout << cell.first << " "
            << cell.second << std::endl;
            
        std::remove(cells.begin(), cells.end(), cell);
    }
    
    return 0;
}
http://ideone.com/EsETYN

Добавлено через 1 минуту
Т.е. отдельно храним массив с ячейками - [0, N]. Выбираем случайную от 0 до N, меняем ее местами с последней, уменьшаем N. Таким образом каждый раз будем выбирать только из свободных.
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
05.04.2014, 11:12  [ТС]     Rand() #6
C++
1
arr[r1][r2]=='O'
Вот я кретин:сравнивал,вместо присваивания,причём компилятор об этом говорил...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 11:49     Rand()
Еще ссылки по теме:

rand()%(-20)%(20); C++
rand C++
rand() C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IrineK
Заблокирован
05.04.2014, 11:49     Rand() #7
Цитата Сообщение от Игорюня Посмотреть сообщение
Собсно-это кусок кода
С учетом обнаруженных багов замените этот кусок (все пять строчек) на:
C++
1
2
3
4
5
6
7
r1 = rand()%3;
r2 = rand()%3;
while (r1 == a && r2== b)
{   r1 = rand()%3;
    r2 = rand()%3;
}
arr[r1][r2] = 'O';
Yandex
Объявления
05.04.2014, 11:49     Rand()
Ответ Создать тему
Опции темы

Текущее время: 16:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru