Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
1

Случайные значения для разных объектов

12.09.2010, 17:00. Показов 978. Ответов 10
Метки нет (Все метки)

Здравствуйте. Я тут взялся за консольный морской бой, нарыл на форуме пару способов генерации
случайных чисел, только есть проблема..... Допустим есть 3 корабля ship1, ship2 и ship3. Я бы хотел
чтобы функция SetCoords() генерировала для каждого разные случайные координаты, а она для
всех одинаковые генерирует.
Подскажите пожалуйста как с этим разобраться?
Спасибо.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <time.h>
using namespace std;
 
class Battleship
{
    int X; int Y;
 
public:
    void SetCoords();
    int GetCoordX();
};
 
void Battleship::SetCoords()
{
srand(time(NULL));
int min = 3; int max = 13;
X = min + rand() % (max - min);
Y = min + rand() % (max - min);
}
 
int Battleship::GetCoordX()
{
    return X;
}
 
int main()
{
    Battleship ship1;
    Battleship ship2;
    Battleship ship3;
 
    ship1.SetCoords();
    ship2.SetCoords();
    ship3.SetCoords();
 
    cout << ship1.GetCoordX() << endl;
    cout << ship2.GetCoordX() << endl;
    cout << ship3.GetCoordX() << endl;
 
 
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2010, 17:00
Ответы с готовыми решениями:

Получение состояния переменной из разных скриптов для разных объектов и её изменение
Есть два объекта: player и sensor, и два скрипта для каждого объекта: move (Для player) и...

Список переменных для разных объектов
Мне требуется хранить некоторые переменные для разных объектов: допустим объект &quot;ученик&quot; имеет имя...

Одинаковые события для разных объектов
Добрый день. у меня в каталоге товаров надо при наведении мышки, что бы менялась информация. ...

Параллельное выполнение анимации для разных объектов
есть такой скрипт: jQuery(document).ready(function($){ $('.zagolovok').click(function(){...

10
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.09.2010, 17:07 2
NikolaWhite, srand(time(NULL)) лучше в main я думаю поставить.
1
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
12.09.2010, 17:53  [ТС] 3
Может тогда подскажете как сделать чтоб они н повторялись?
Я просмотрел пост "Случайные числа" , только там пример громоздкий и многое мне в нем
еще не понятно.
Буду оч признателен.
0
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.09.2010, 18:07 4
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <cstdlib>
#include <ctime>
 
void gen_random_uniq2( int arr_size, int *parr, int range_min, int range_max );
 
/* ================================================================ */
int main() 
{ 
int arr_size;
int*arr;
int range_min, range_max;
 
 
srand( time( NULL ) );
 
std::cout<<"Enter arr_size: ";
std::cin>>arr_size;
arr=new int[arr_size];
std::cout<<"Enter range_min: ";
std::cin>>range_min;
std::cout<<"Enter range_max: ";
std::cin>>range_max;
 
if(arr_size<=0)
{
    std::cerr<<"Can`t be 0 or less then 0!\n";
    return 1;
}
 
gen_random_uniq2(arr_size, arr, range_min, range_max );
 
std::cout<<"random unique array: array size is "<< arr_size <<" range is ["<<range_min<<';'<< range_max <<']'<<std::endl;
 
for (int i= 0; i<arr_size; i++ ) {
        std::cout<<arr[i]<<' ';
}
std::cout<<std::endl;
delete[] arr;
return 0;
 
} 
 
/* ================================================================ */
void gen_random_uniq2( int arr_size, int *parr, int range_min, int range_max ) {
 
int i, arr2_size, index, range_width;
int *parr2= NULL;
 
range_width= range_max-range_min+1;
 
parr2= new int[range_width];
 
for ( i= 0; i<range_width; i++ ) {
        parr2[i]= range_min+i;
}
 
arr2_size= range_width;
for ( i= 0; i<arr_size; i++ ) {
        index= rand()%arr2_size;
        parr[i]= parr2[index];
        arr2_size--;
        parr2[index]= parr2[arr2_size];
}
 
delete[]parr2;
 
}
1
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
13.09.2010, 20:38  [ТС] 5
Привет всем. Я тут помучался и написал таки функцию которая генерирует неповторяющиеся
координаты для поля 10х10 морского боя. Я совсем недавно начал изучать С++ , так что это было
нелегко для меня .
Кому не лень можете раскритиковать в пух и прах.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <ctime>
using namespace std;
 
class Battleship
{
int X; int Y;
public:
    void SetCoords(int *Arr, int *XYarr);
    int GetCoordX();
    int GetCoordY();
};
 
int Battleship::GetCoordX() {return X;}
int Battleship::GetCoordY() {return Y;}
 
void Battleship::SetCoords(int *Arr, int *XYarr)
{ 
    int cols = 10; // кол-во колонок в Arr[100]
int Index = rand() % 10;
X = XYarr[Index];
Index = rand() % 10;
Y = XYarr[Index];
 
int plus = 1;
    while(*(Arr + X*cols + Y + plus) == 0)
    {
    if(X == 10 && Y == 10) // если последний элемент массива и равен 0 ,двигай назад.
        plus -= 1;
    else
        plus += 1;         // если равен 0 значит координаты использовались,
    }                        // перейди к следующему элементу.
 
      *(Arr + X*cols + Y + plus) = 0; // адрес в массиве ,совпадающий с этими координатами
                                   // содержит 0 - значит больше не использовать.
 
}
 
int main()
{
    srand(time(NULL));
Battleship ship1;
Battleship ship2;
Battleship ship3;
Battleship ship4;
//*********************************************************
    int* Arr;
    Arr = new int[100]; // вместо двумерного массива 10x10
    for(int i = 0;i < 100;i++)
        Arr[i] = i + 1;
    int* XYarr;
    XYarr = new int[10]; // 10 неповторяющихся чисел от  до 10.
    for(int i = 0;i < 10;i++) 
        XYarr[i] = i + 1;
    //*******************************************************
    ship1.SetCoords(Arr, XYarr);
    ship2.SetCoords(Arr, XYarr);
    ship3.SetCoords(Arr, XYarr);
    ship4.SetCoords(Arr, XYarr);
          cout << "X =  " << ship1.GetCoordX() << "  Y =  " << ship1.GetCoordY() << endl;
          cout << "X =  " << ship2.GetCoordX() << "  Y =  " << ship2.GetCoordY() << endl;
          cout << "X =  " << ship3.GetCoordX() << "  Y =  " << ship3.GetCoordY() << endl;
          cout << "X =  " << ship4.GetCoordX() << "  Y =  " << ship4.GetCoordY() << endl;
 
        system("pause");
}
0
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59
13.09.2010, 22:27 6
Сразу бросилось в глаза
1) int main() ничего не возвращает (делай тогда void main()).
2) динамические объекты не уничтожаются.
1
Эксперт С++
2337 / 1710 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.09.2010, 22:41 7
Цитата Сообщение от bobromet Посмотреть сообщение
1) int main() ничего не возвращает (делай тогда void main()).
По стандарту main должна возвращать целочисленное значение.
Если код возврата не возвращается явно, его принимают за 0.
2
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
13.09.2010, 22:59  [ТС] 8
динамические объекты не уничтожаются.
Я нарочно не стал ничего уничтожать. Еще хотел спросить а обязательно ли это в данном случае.

int main() ничего не возвращает (делай тогда void main()).
Это избитая тема. Я предпочитаю не заморачиваться насчет return 0, т.к.
Если код возврата не возвращается явно, его принимают за 0.
1
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59
13.09.2010, 23:06 9
CyBOSSeR, то есть, если не возвращать открыто ноль это не будет считатся за ошибку? Тысячу раз читал на этом форуме что компилер покарает меня за это, может не сейчас но позже .)

NikolaWhite, а я void пишу и не жужу , знаю что не хорошо, и что не все компилеры это любят . А объекты уничтожать точно надо, ты ведь мусор выносишь когда корзина полная. Почитай про memory leak - утечка памяти, меня одно название уже пугает .)
0
Эксперт С++
2337 / 1710 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.09.2010, 23:12 10

Не по теме:

Цитата Сообщение от bobromet Посмотреть сообщение
CyBOSSeR, то есть, если не возвращать открыто ноль это не будет считатся за ошибку?
Не волнуйся, если компилятор сочтет это за ошибку, то ты об этом узнаешь:).


bobromet, вот выжимки из стандарта C++03:
<...> It shall have a return type of type int <...>
<...> If control reaches the end
of main without encountering a return statement, the effect is that of executing
C++
1
return 0;
1
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
13.09.2010, 23:24  [ТС] 11
<...> If control reaches the end
of main without encountering a return statement, the effect is that of executing
Если кто не силен в английском:
"Если программа доходит до конца функции main() и не встречает return - это означает что
программа выполнена успешно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2010, 23:24

Rand разное значение для разных объектов
void A::zapolnenie_rand() { int c; int *a=new int; srand(time(NULL)); *a= rand() % 10;...

Вызов одинакового метода для разных объектов из массива
Напишите три класса: Secretary, Director и Programmer. Каждый из них должен содержать метод...

Универсальный метод ввода для данных разных объектов
Есть программа, в которой в одном классе существуют интерфейс, родительский класс, который...

Одна процедура для изменения одного св-ва разных объектов
Здравствуйте, столкнулся с такой проблемой: Необходимо реализовать работу процедуры с одним св-вом...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.