4 / 4 / 2
Регистрация: 01.12.2009
Сообщений: 238
1

Перемешивание двухмерного массива

22.06.2011, 19:47. Показов 5344. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как можно перемешать двухмерный массив таким образом , чтобы он в цикле по строкам и столбцам массива перебирал элементы массива по разу и менял местами значения текущего элемента и случайно выбранного элемента массива.
Сам массив:



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
#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() .Но это не то что нужно .Там просто выбирает случайные элементы .А мне нужно чтоб они даже не повторялись.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2011, 19:47
Ответы с готовыми решениями:

Перемешивание массива
как переписать мой код так чтоб программа печатала функцию несколько раз.и чтоб ответы Rand не...

Перемешивание двумерного массива
Помогите! Не могу додуматься, как перемешать двумерный массив, интернет уже весь перелопатил, так...

Перемешивание элементов массива случайным образом
Здравствуйте. Помогите написать функцию, которая рандомно перемешивает элементы массива. void...

Перемешивание элементов массива случайным образом
Здравствуйте! Помогите пожалуйста. Нужно перемешать елементы массива случайным образом. Масив...

17
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
22.06.2011, 21:40 2
Я задание не понял. Ты должен пробежаться по массиву и с каждым и с каждым элементом что сделать?
0
4 / 4 / 2
Регистрация: 01.12.2009
Сообщений: 238
22.06.2011, 21:52  [ТС] 3
Запусти ее в IDE .Увидишь она распечатывает массив по порядку от 1 до 52 .Мне надо его перемешать , чтоб он был в разнобой.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
22.06.2011, 22:03 4
ясно, а алгоритм Лемера пойдёт? Это такая штука, которая позволяет делать следующее: пусть имеется 4 числа 0,1,2,3; вот с помощью этого алгоритма их можно выводить так, чтобы они не повторялись и были перемешаны
2,3,1,0
Так, а если бесконечный цикл запустить то будет так:
2,3,1,0,2,3,1,0,2,3,1,0,2,3,1,0,

Кроме того можно менять начальное значение, другие всякие параметры в общем всяко можно мешать, например:3,1,0,2 и т.д., повторяться не будут

По-моему, твой случай
0
4 / 4 / 2
Регистрация: 01.12.2009
Сообщений: 238
22.06.2011, 22:09  [ТС] 5
Ты как бы мне для одномерного массива предлагаешь -если я правильно понял.А мне нужно для двух мерного!
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
22.06.2011, 22:31 6
Да вот не по фиг. Если этот алгоритм тебе подходит в смысле случайности, тогда делай так:
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 <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;
        }
 
        //Пусть эти числа у тебя выпали с помощью алгоритма Лемера:
        int ch_1= 36;         
        int ch_2= 48;         
        int ch_3= 8;         
        //Вообще-то их должно выпасть 52 неповторяющихся числа, но для примера возьмём три числа
 
 
        //Вывод будешь осуществлять так:
        printf("%d\n", deck [ch_1/13][ch_1%13]); 
        printf("%d\n", deck [ch_2/13][ch_2%13]); 
        printf("%d\n", deck [ch_3/13][ch_3%13]); 
 
        system("pause");        
        return 0;
 
}
0
4 / 4 / 2
Регистрация: 01.12.2009
Сообщений: 238
22.06.2011, 22:39  [ТС] 7
Если так все 52 числа выводить то это полный бред получится , а если их 1000 будет или более.Надо значит что то другое.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
22.06.2011, 22:49 8
Естественно.
Ну, я думаю ты сам дойдёшь как сделать это красиво и компактно. Удачи!
0
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
23.06.2011, 01:03 9
что вы тут мутите?
C++
1
2
3
4
5
6
7
          for(int j = 0;j <= 12; j++)
              for(int i = 0; i <= 3; i++) {
                  int temp=deck[i][j];
                  int val=rand()%4;
                  deck[i][j]=deck[val][j];
                  deck[val][j]=temp;
              }
0
4 / 4 / 2
Регистрация: 01.12.2009
Сообщений: 238
23.06.2011, 06:52  [ТС] 10
В
C++
1
int val=rand()%4;    deck[i][j]=deck[val][j];
Может же такое быть что случайно сгенерируется одно и тоже число.Тогда в массиве из 52 чисел попадутся 2 одинаковых значения!!??
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
23.06.2011, 07:40 11
Цитата Сообщение от Stenl1 Посмотреть сообщение
как можно перемешать двухмерный массив таким образом , чтобы он в цикле по строкам и столбцам массива перебирал элементы массива по разу и менял местами значения текущего элемента и случайно выбранного элемента массива
Для этого нужно
Цитата Сообщение от Stenl1 Посмотреть сообщение
в цикле по строкам и столбцам массива перебирал элементы массива по разу и менял местами значения текущего элемента и случайно выбранного элемента массива
У тебя же алгоритм подробно описан! В чём вообще вопрос то быть может? Обход массива ты делать умеешь. Генерировать случайное число - тоже. В задании не сказано, что ты не можешь менять местами один и тот-же элемент несколько раз, ты это выдумал сам. Сам придумал себе гемор и мучаешься. Делай именно то, что от тебя требуется по заданию и никаких вопросов не возникнет.
0
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
23.06.2011, 13:08 12
Stenl1,
лишних чисел в массиве НЕ появится.
запускать то пробывал?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
23.06.2011, 19:09 13
Цитата Сообщение от OstapBender Посмотреть сообщение
что вы тут мутите?



мутишь ты, я дело говорю. Я пробовал запускать.
14 1 40 1
28 41 2 2
3 29 29 3
17 30 4 4
44 5 44 18
19 45 6 19
33 46 33 46
47 8 8 34
35 48 35 48
10 23 10 10
24 24 11 11
12 25 51 25
13 13 26 39
0
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
23.06.2011, 20:44 14
kravam, чего????
что ты за листинг кинул??
он невозможен!
мой алгоритм - это стандартный банальный алгоритм перемешивания (ведь оно нужно ??)
да, некоторые элементы могут переставиться 2 или больше раз, но кого волнует?

цитирую:
Цитата Сообщение от Stenl1 Посмотреть сообщение
Подскажите как можно перемешать двухмерный массив таким образом , чтобы он в цикле по строкам и столбцам массива перебирал элементы массива по разу и менял местами значения текущего элемента и случайно выбранного элемента массива.
привожу 4 скрина работы моей программы
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
24.06.2011, 15:56 15
OstapBender, я понял, но тогда надо:
C++
1
2
3
4
5
6
7
          int* p= &deck [0][0];
          for(int i = 0;i < 4* 13; i++) {
                                  int temp=p[i];
                                  int val=rand()%(4* 13);
                                  p[i]=p[val];
                                  p[val]=temp;
                          }
, согласись?
0
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
24.06.2011, 16:02 16
kravam,
ну да, ты выполнил обычное перемешивание массива, что аналогично std::random_shuffle(&deck[0][0],&deck[0][0]+4*13);

а я сделал случайное перемешивание столбцов.
пусть автор выбирает уже че ему угодно)
0
2300 / 1220 / 246
Регистрация: 16.03.2008
Сообщений: 5,822
Записей в блоге: 2
24.06.2011, 16:12 17
Если надо каждый только по одному разу дернуть, может что то типа того:
1. Делаем динамический одномерный массив, который просто содержити ндексы исходного
2. бежим по созданному: берем первый элемент, берем случайный рандомом от 2 до последнего
3. меняем выбранные элементы в основном массиве местами
4. удаляем два обработанных элемента из динамического масива
5 продолжаем пп 2-4 пока в динамическом два и больше элементов
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
24.06.2011, 17:04 18
Как вариант сгодится, трабла в том, что ТС, похоже лень реализовывать. НАдеюсь, что я я ошибаюсь.
0
24.06.2011, 17:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2011, 17:04
Помогаю со студенческими работами здесь

Случайное перемешивание содержимого одномерного массива
Здравствуйте. Подскажите пожалуйста как реализовать случайное перемешивание содержимого одномерного...

Перемешивание элементов массива - найти ошибку в коде
Добрый день! Помогите с заданием: необходимо перемешать элементы массива сам массив: const int...

Передача двухмерного массива в функцию и изменение элемента массива
Такая проблема! Нужно передать в функцию двухмерный массив и изменить на елемент который равен 0 и...

Перенос повторяющихся значений из двухмерного двухмерного массива в другой массив и запуск функции
Здравствуйте, форумчане! У меня есть двухмерный массив (string,string) В первом столбце хранятся...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru