Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2011, 00:06   #1
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию Перемешивание двухмерного массива

Подскажите как можно перемешать двухмерный массив таким образом , чтобы он в цикле по строкам и столбцам массива перебирал элементы массива по разу и менял местами значения текущего элемента и случайно выбранного элемента массива.
Сам массив:
Код:
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{	
	int card =1;
	int deck[4][13]; //private

	for(int row = 0; row <= 3; row++)
	{
		
	     for(int column = 0; column <= 12; column++)
		{
			deck[row][column] = card;
			card++;
		}
	}
/**********************************/
 //Вывод массива по правильном порядке
          for(int i = 0;i <= 3; i++)
	{
		for(int j = 0; j <= 12; j++)
			cout << setw(2)<< deck[i][j] << ' ';
		cout << endl;
	}
	system("pause");	
	return 0;
}
Пробовал через функцию rand() .Но это не то что нужно .Там просто выбирает случайные элементы .А мне нужно чтоб они даже не повторялись.
stenl1 вне форума Ответить с цитированием
Старый 22.06.2011, 00:26   #2
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от stenl1 Посмотреть сообщение
Подскажите как можно перемешать двухмерный массив таким образом , чтобы он в цикле по строкам и столбцам массива перебирал элементы массива по разу и менял местами значения текущего элемента и случайно выбранного элемента массива.
Код:
void mix ( int ** deck )
{
	int tmp, t_row, t_column;
	for(int row = 0; row <= 3; row++)
	{
	     for(int column = 0; column <= 12; column++)
		{
			tmp = deck[row][column];
			t_row = rand() % 4;
			t_column = rand() % 13;
			deck[row][column] = deck[t_row][t_column];
			deck[t_row][t_column] = tmp;
		}
	}
}
В начале программы напиши:
Код:
srand ( 0);
Не будут они повторятся, значения просто местами меняются со значениями случайной ячейки.
An1ka вне форума Ответить с цитированием
Старый 22.06.2011, 19:43   #3
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию

У меня этот код вообще никак работать не хочет .Компелируется нормально , а выводить массив не хочет. (Вывод осуществляю через for)Вы проверьте у себя и напишите плз. полностью с выводом массива.
stenl1 вне форума Ответить с цитированием
Старый 22.06.2011, 20:19   #4
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Код:
#include <iostream>
#include <iomanip>
using namespace std;

int card =1;
int deck[4][13];

void init ( )
{
	for(int row = 0; row <= 3; row++)
	{
	     for(int column = 0; column <= 12; column++)
		{
			deck[row][column] = card;
			card++;
		}
	}
}
void mix ( )
{
	int tmp, t_row, t_column;
	for(int row = 0; row <= 3; row++)
	{
	     for(int column = 0; column <= 12; column++)
		{
			tmp = deck[row][column];
			t_row = rand() % 4;
			t_column = rand() % 13;
			deck[row][column] = deck[t_row][t_column];
			deck[t_row][t_column] = tmp;
		}
	}
}
void output ( )
{
    for(int i = 0;i <= 3; i++)
	{
		for(int j = 0; j <= 12; j++)
			cout << setw(2)<< deck[i][j] << ' ';
		cout << endl;
	}
}

int main()
{	
	srand ( time ( 0));
	init ( );
 //Вывод массива в правильном порядке
	output ( );
 //Смешиваем массив
	mix( );
	cout << "Mixed:"<< endl;
	output ( );

	system("pause");	
	return 0;
}

Последний раз редактировалось An1ka; 22.06.2011 в 20:24.
An1ka вне форума Ответить с цитированием
Старый 22.06.2011, 20:38   #5
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию

Спасибо все работает.И появился вопросик: А что функция rand не может в массив из 52 элементов 2 одинаковых элемента запихать? Почему?Как тогда она узнает что цифра 3 уже есть и ее надо заменить другой.

Последний раз редактировалось stenl1; 22.06.2011 в 20:41.
stenl1 вне форума Ответить с цитированием
Старый 22.06.2011, 20:44   #6
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Вопрос.
А обязательно ли делать все это через ж... *зачеркнуто* двумерный массив? -)
В сторону векторов и функции random_shuffle() нет желания посмотреть?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 22.06.2011, 20:49   #7
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию

Цитата:
В сторону векторов и функции random_shuffle() нет желания посмотреть?
Я про нее не знаю.А так бы конечно почему бы и нет готовыми , норм. функциями воспользоваться.А так пока и это для учебы пойдет.

Может же произойти такое при перемешивании массива!!!
Код:
int deck[4][13];
void mix ( )
{
	int tmp, t_row, t_column;
	for(int row = 0; row <= 3; row++)
	{
	     for(int column = 0; column <= 12; column++)
		{
			tmp = deck[row][column]; //в инициализованном массивве попала 1 кидаем ее в tmp
			t_row = rand() % 4; 
			t_column = rand() % 13;
			deck[row][column] = deck[t_row][t_column]; //случайно выпалл число 6 и 6 мы замещаем 1
			deck[t_row][t_column] = tmp;// тут 1 замещаем 6 т.е поменяли местами
		}// а может же быть что случайно на следующей итерации выпасть опять 6 и она поменяется с другим эл. массива
	}// то есть при перемешивании массива могут попасться одинаковые числа???
}
}
Неужели никто не может объяснить этот код.

Последний раз редактировалось Stilet; 27.06.2011 в 14:09.
stenl1 вне форума Ответить с цитированием
Старый 25.06.2011, 18:28   #8
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Могут и одинаковые числа выпадать. Да.
An1ka вне форума Ответить с цитированием
Старый 26.06.2011, 19:16   #9
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию

Цитата:
Сообщение от An1ka Посмотреть сообщение
Могут и одинаковые числа выпадать. Да.
Вот в чем и дело!!!А мне нужно чтоб числа не могли некогда совпасть.Просто перемешивался массив этих чисел, но не когда не совпадали числа.
stenl1 вне форума Ответить с цитированием
Старый 26.06.2011, 21:54   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вот в чем и дело!!!А мне нужно чтоб числа не могли некогда совпасть.
То, что Вы перемешиваете колоду игральных карт, это уже понятно.
А вот то, что Вы собственно хотите получить - совсем не понятно... Ну выпали одинаковые числа и что?

И прочитайте, кстати, эту тему, тут есть как не надо (и как надо) тасовать карты: пост ТУТ (и по ссылкам в данном сообщении обязательно сходите)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение двухмерного массива _PrizraK_ Общие вопросы Delphi 1 01.05.2011 14:23
Передача двухмерного массива в функцию tem_80 Общие вопросы C/C++ 3 18.02.2011 23:47
Перемешивание массива revaldo666 Общие вопросы C/C++ 6 19.01.2011 15:04
Сортировка строк двухмерного массива EfiopianDIMON Общие вопросы C/C++ 9 26.05.2009 22:52
Сортировка вставками двухмерного массива ponchikpk Помощь студентам 6 09.03.2009 13:34