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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
#1

Повтор случайного числа в строке матрицы - C++

04.08.2010, 21:26. Просмотров 1078. Ответов 21
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <ctime>
using namespace std;
 
int main()
{
    const int COLUMN = 8;
    const int ROW = 22;
    int matrix[ROW][COLUMN];
    srand(time (NULL));
    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COLUMN; j++)
        {
            matrix[i][j] = rand() % 10000;
            cout << matrix[i][j] << "\t";
        }
        cout << endl << endl;
    }
    system("PAUSE");
    return 0;
}
вот программа, нужно доделать, чтобы в каждой строке повторялось одно число
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2010, 21:26     Повтор случайного числа в строке матрицы
Посмотрите здесь:

C++ Генерация случайного числа
C++ Вопрос по генерации случайного числа.
C++ Генерация случайного числа, максимально случайного
Генерация случайного простого числа C++
Запись текста и генерация случайного числа C++
C++ Корни квадратного уравнения, кратность случайного числа, процент от числа
Генерация случайного числа каждую секунду C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.08.2010, 21:28     Повтор случайного числа в строке матрицы #2
RoY_Mu$T@nG, Что-что что? Как это в каждой строке одно число? оО
Чтобы в i строке были все числа одним и тем же? Или чтобы не более одного повтора? Или же в каждой строке одно одинаковое число один раз?
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 21:45  [ТС]     Повтор случайного числа в строке матрицы #3
мне нужно чтобы в каждой строке был обязательно один повтор, но только один...и чтобы он выбирался случайно
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.08.2010, 21:51     Повтор случайного числа в строке матрицы #4
RoY_Mu$T@nG, ээ... а это возможно?
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 22:14  [ТС]     Повтор случайного числа в строке матрицы #5
а вот не знаю)

Добавлено через 13 минут
суть в том что выбрать случ. число для повтора и заполнить 2 случайные ячейки строки матрицы этим числом, затем при заполнении остальными числами пропускаем те клетки где уже стоит то самое число
если сгенерированное число равно выбранному ранее для 2х клеток то увеличиваем его на 1...
по сути сам алгоритм..как реализовать

Добавлено через 25 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    int repeatNumber, rand_j1, rand_j2, randN;
    for(int i = 0; i < ROW; i++)
        {
            repeatNumber = rand()%10000;
          rand_j1 = rand()%COLUMN-1;
            rand_j2 = rand()%COLUMN-1;
            matrix[ rand_j1 ] = repeatNumber;
            matrix[ rand_j2 ] = repeatNumber;   
                for(int j = 0; j < COLUMN; j++)
                {
                    randN = rand()%10000;
                    if(randN == repeatNumber) randN++;
                    if(j == rand_j1 || j == rand_j2) continue;
                    matrix[j] = randN;
                }         
        }
вот нерабочее...что нибудь на подобии

Добавлено через 9 минут
что нибудь в этом роде
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
#include <iostream>
#include <ctime>
using namespace std;
 
int main()
{
    const int COLUMN = 8;
    const int ROW = 22;
    int matrix[ROW][COLUMN];
    srand(time (NULL));
    int repeatNumber, rand_j1, rand_j2, randN;
    for(int i = 0; i < ROW; i++)
        {
            repeatNumber = rand()%10000;
          rand_j1 = rand()%COLUMN-1;
            rand_j2 = rand()%COLUMN-1;
            matrix[ rand_j1 ][i] = repeatNumber;
            matrix[ rand_j2 ][i] = repeatNumber;   
                for(int j = 0; j < COLUMN; j++)
                {
                    randN = rand()%10000;
                    if(randN == repeatNumber) randN++;
                    if(j == rand_j1 || j == rand_j2) continue;
                    matrix[j][i] = randN;
                }         
        }
        for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COLUMN; j++)
        {
            cout << matrix[i][j] << "\t";
        }
        cout << endl << endl;
    }
    system("PAUSE");
    return 0;
}
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 22:26     Повтор случайного числа в строке матрицы #6
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
суть в том что выбрать случ. число для повтора и заполнить 2 случайные ячейки строки матрицы этим числом, затем при заполнении остальными числами пропускаем те клетки где уже стоит то самое число
я предлагаю поступить тебе иначе.
сначала заполняешь строку случайными значениями без повторов, что мы уже проделывали в другом топике.
потом рандомно выбираешь номер ячейки и копируешь значение из нее в другую случайно выбранную ячейку.
такую операцию провести со всеми строками.
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 22:30  [ТС]     Повтор случайного числа в строке матрицы #7
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
#include <iostream>
#include <time.h>
 
using namespace std;
 
int main(void)
{
  srand(time(NULL));
  const int ROW = 5, COLUMN = 5;
  int matrix[ROW][COLUMN];
  int repeatNumber, j1, j2, randN;
  for(int i = 0; i < ROW; i++)
        {          
            repeatNumber = rand()%10000;
            j1 = rand()%COLUMN;
            j2 = rand()%COLUMN;               
               if(j1 == j2) {
                  if(j1 == COLUMN-1) j1 = 0;
                  else j1++;
               }
            matrix[i][ j1 ] = repeatNumber;
               matrix[i][ j2 ] = repeatNumber;               
                for(int j = 0; j < COLUMN; j++)
                {
                    randN = rand()%10000;
                    if(randN == repeatNumber) randN++;
                    if(j == j1 || j == j2) continue;
                    matrix[i][j] = randN;
                }         
                    
    }
     
     for(int i = 0; i < ROW; i++) {    
                for(int j = 0; j < COLUMN; j++)                                                         
                       cout << matrix[i][j] << " ";
         cout << endl;
    }
     system("PAUSE");
   return 0;
}
вот рабочий...но второй вариант тоже хочу..заполнить легко...как из одного в другое адрес перекинуть
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3787 / 1769 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
05.08.2010, 09:10     Повтор случайного числа в строке матрицы #8
RoY_Mu$T@nG, суть задачи в том, что в строке должно быть одно число из предыдущей?

Если да, тогда так:
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
//---------------------------------------------------------------------------
#include <iostream>
#include <stdlib>
//---------------------------------------------------------------------------
int main()
{
  const Size = 5;
  int Mas[Size][Size];
  int RandPos, OldPos;
 
  srand(time(NULL));
  for (int i = 0; i < Size; i++) {
    RandPos = rand() % Size;
    OldPos = rand() % Size;
    for (int j = 0; j < Size; j++) {
      Mas[i][j] = rand() % 99;
      if (i != 0 && j == RandPos)  Mas[i][RandPos] = Mas[i-1][OldPos];
      std::cout << Mas[i][j] << "\t";
      if (j == Size - 1) std::cout << std::endl;
    }
  }
  system("pause");
 
  return 0;
}
//---------------------------------------------------------------------------
Nameless One
Эксперт С++
 Аватар для Nameless One
5761 / 3410 / 255
Регистрация: 08.02.2010
Сообщений: 7,413
05.08.2010, 10:32     Повтор случайного числа в строке матрицы #9
Вот с лямбдами и алгоритмами:
В каждой строке только пара элементов равна, остальные - уникальны:
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
#include <iostream>
#include <set>
#include <ctime>
#include <iomanip>
#include <algorithm>
 
int main()
{
    srand(static_cast<size_t>(time(NULL)));
    const size_t N = 22;
    const size_t M = 8;
    const int upperBound = 20;
    int arr[N][M];
    std::for_each(arr, arr + N, [=](int* row)
    {
        int rptVal = rand() % upperBound;
        std::set<int> existingValues;
        row[0] = row[1] = rptVal;
        existingValues.insert(rptVal);
        std::generate(row + 2, row + M, [=, &existingValues] () -> int
        {
            int returnValue;
            do
            {
                returnValue = rand() % upperBound;
            }
            while(existingValues.find(returnValue) != existingValues.end());
            existingValues.insert(returnValue);
            return returnValue;
        });
        std::random_shuffle(row, row + M);
        std::for_each(row, row + M, [](int i)
        {
            std::cout << std::left << std::setw(8) << i;
        });
        std::cout << std::endl;
    });
    system("pause");
    return 0;
}

Не по теме:

Кстати, никто не знает, почему при попытке явно захватить upperBound в строке 20 происходит ошибка компиляции?



Добавлено через 11 минут
Цитата Сообщение от easybudda Посмотреть сообщение
Я в этом новом чудо-синтаксе ещё не разобрался, но по-моему тут закрывающей скобки не хватает...
Она идет сразу же просле первой закрывающейся фигурной скобки Лямбда вместе с телом передается в качестве параметра алгоритма for_each.
easybudda
05.08.2010, 10:34
  #10

Не по теме:

Nameless One, да, до меня потом дошло... Как-то всё совсем непросто стало...

Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
05.08.2010, 13:21  [ТС]     Повтор случайного числа в строке матрицы #11
где ошибка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
    const int ROW = 22, COLUMN = 8;
    int matrix[ROW][COLUMN];
    srand(time (NULL));
    for(int i = 0; i < ROW; i++)
        for(int j = 0; j < COLUMN; j++)
            matrix[i][j] = rand()%100;
    for(int i = 0; i < ROW; i++)
    {
        int l = rand()%9;
        int k = rand()%9;
        matrix[i][l] = matrix[i][k];
    }
    for(int i = 0; i < ROW; i++)
        for(int j = 0; j < COLUMN; j++)
            cout << matrix[i][j] << "\t";
    cout << endl;
    return 0;
}
пытался сделать по методу fasked
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.08.2010, 13:28     Повтор случайного числа в строке матрицы #12
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
где ошибка
второй цикл сделай вот так примерно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    for(int i = 0; i < ROW; i++)
    {
        int l = 0, k = 0;
        do
        {
            l = rand() % COLUMN;
            k = rand() % COLUMN;
        }
        while(l == k);
 
        matrix[i][l] = matrix[i][k];
    }
результат такой (размеры матрицы я поменял для удобства проверки)
Код
 41 53 53 67 62
 82 34 54 34 11
 16 29 16 96 61
 95 25 62 90 90
 18 51 41 54 18
только обеспечь первое заполнение матрицы гарантированно без повторов
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
05.08.2010, 13:58  [ТС]     Повтор случайного числа в строке матрицы #13
а как осуществить проверку на повторяемость при заполнении
Nameless One
Эксперт С++
 Аватар для Nameless One
5761 / 3410 / 255
Регистрация: 08.02.2010
Сообщений: 7,413
05.08.2010, 14:06     Повтор случайного числа в строке матрицы #14
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
а как осуществить проверку на повторяемость при заполнении
Генерируешь число, проверяешь, не равно ли это число предыдущим элементам текущим строки, и если не равно, то присваиваешь текущему элементу, в противном случае генерируешь новое число.
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
05.08.2010, 14:13  [ТС]     Повтор случайного числа в строке матрицы #15
как его сравнить с предыдущими...
Nameless One
Эксперт С++
 Аватар для Nameless One
5761 / 3410 / 255
Регистрация: 08.02.2010
Сообщений: 7,413
05.08.2010, 14:19     Повтор случайного числа в строке матрицы #16
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
как его сравнить с предыдущими...
Сравнивай его с элементами, у который индекс меньше, чем у текущего элемента
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.08.2010, 14:24     Повтор случайного числа в строке матрицы #17
вот задача полностью.
важная особенность, чем больше и ближе к друг друга значения lim и COLUMN, тем дольше решается задача. если COLUMN больше, чем lim - решение является недостижимым и программа выдаст сообщение об ошибке.
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
69
70
71
72
73
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    const int ROW = 5, COLUMN = 9;
    const int lim = 9;
 
    if(COLUMN > lim)
    {
        cout << "impossible value COLUMN or lim" << endl;
 
        system("pause");
        return EXIT_FAILURE;
    }
 
    int matrix[ROW][COLUMN];
    
    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COLUMN; j++)
        {
            bool repeat = false;
            int t = 0;
 
            do
            {
                repeat = false;
                t = rand() % (lim + 1);
 
                for(int k = 0; k < j; ++k)
                {
                    if(t == matrix[i][k])
                    {
                        repeat = true;
                        break;
                    }
                }
            }
            while(repeat);
 
            matrix[i][j] = t;
        }
    }
 
    for(int i = 0; i < ROW; i++)
    {
        int l = 0, k = 0;
        do
        {
            l = rand() % COLUMN;
            k = rand() % COLUMN;
        }
        while(l == k);
 
        matrix[i][l] = matrix[i][k];
    }
 
    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COLUMN; j++)
            cout << setw(3) << matrix[i][j];
 
        cout << endl;
    }
 
    cout << endl;
 
    system("PAUSE");
    return 0;
}
здесь граница генерируемых чисел от 0 до lim включительно, то есть [0,lim].
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
05.08.2010, 15:21  [ТС]     Повтор случайного числа в строке матрицы #18
fasked, совершенно понятный код, спасибо большое)

Добавлено через 30 минут
а если изменить чтобы в строке повторялось первое значение из строки...т.е.
1 2 3 4 1
2 3 4 2 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
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
69
70
71
72
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    const int ROW = 22, COLUMN = 8;
    const int lim = 1000;
 
    if(COLUMN > lim)
    {
        cout << "impossible value COLUMN or lim" << endl;
 
        system("pause");
        return EXIT_FAILURE;
    }
 
    int matrix[ROW][COLUMN];
    
    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COLUMN; j++)
        {
            bool repeat = false;
            int t = 0;
 
            do
            {
                repeat = false;
                t = 100 + rand() % (lim - 100 + 1);
 
                for(int k = 0; k < j; ++k)
                {
                    if(t == matrix[i][k])
                    {
                        repeat = true;
                        break;
                    }
                }
            }
            while(repeat);
 
            matrix[i][j] = t;
        }
    }
 
    for(int i = 0; i < ROW; i++)
    {
        int l = 0;
        do
        {
            l = rand() % COLUMN;
        }
        while(l == matrix[i][0]);
 
        matrix[i][l] = matrix[i][0];
    }
 
    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COLUMN; j++)
            cout << setw(3) << matrix[i][j] << "\t";
 
        cout << endl << endl;
    }
 
    cout << endl;
 
    system("PAUSE");
    return 0;
}
Добавлено через 8 минут
вот, цифры изменяются, но совпадения не везде
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
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
        const int ROW = 22, COLUMN = 8;
        int matrix[ROW][COLUMN];
        srand(time (NULL));
        for(int i = 0; i < ROW; i++)
                for(int j = 0; j < COLUMN; j++)
                {
                    bool repeat = false;
                    int t = 0;
                    do
                    {
                        repeat = false;
                        t = 100 + rand() % (1000 - 100 + 1);
                        for(int k = 0; k < j; ++k)
                        {
                            if(t == matrix[i][k])
                            {
                                repeat = true;
                                break;
                            }
                        }
                    }while(repeat);
                    matrix[i][j] = t;
                }
        for(int i = 0; i < ROW; i++)
        {
            int k = 0;
            do{
                k = rand()%9;
            }while(k == matrix[i][0]);
            matrix[i][k] = matrix[i][0];
        }
        for(int i = 0; i < ROW; i++)
        {
                for(int j = 0; j < COLUMN; j++)
                        cout << matrix[i][j] << "\t";
            cout << endl;
        }
        return 0;
}
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.08.2010, 15:24     Повтор случайного числа в строке матрицы #19
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
а если изменить чтобы в строке повторялось первое значение из строки...т.е.
ну да, вроде все верно.
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
и почему то цифры одни и те же
ну так сделай srand(time(NULL))

Добавлено через 1 минуту
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
k = rand()%9;
здесь надо брать не остаток от деления на 9, а остаток от деления на COLUMN. ты же выбираешь номер ячейки! соответственно генерируемое значение должно быть от 0 до COLUMN - 1 включительно!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 15:26     Повтор случайного числа в строке матрицы
Еще ссылки по теме:

Генерация случайного числа с плавающей чточкой C++
C++ Генерация случайного числа
Генерация пятизначного случайного числа C++
C++ Время генерации случайного числа
В каждой строке заданной матрицы найти количество элементов, больших заданного числа C++

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

Или воспользуйтесь поиском по форуму:
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
05.08.2010, 15:26  [ТС]     Повтор случайного числа в строке матрицы #20
вот
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
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
        const int ROW = 22, COLUMN = 8;
        int matrix[ROW][COLUMN];
        srand(time (NULL));
        for(int i = 0; i < ROW; i++)
                for(int j = 0; j < COLUMN; j++)
                {
                    bool repeat = false;
                    int t = 0;
                    do
                    {
                        repeat = false;
                        t = 100 + rand() % (1000 - 100 + 1);
                        for(int k = 0; k < j; k++)
                        {
                            if(t == matrix[i][k])
                            {
                                repeat = true;
                                break;
                            }
                        }
                    }while(repeat);
                    matrix[i][j] = t;
                }
        for(int i = 0; i < ROW; i++)
        {
            int k = 0;
            do{
                k = rand()%COLUMN;
            }while(k == matrix[i][0]);
            matrix[i][k] = matrix[i][0];
        }
        for(int i = 0; i < ROW; i++)
        {
                for(int j = 0; j < COLUMN; j++)
                        cout << matrix[i][j] << "\t";
            cout << endl;
        }
        return 0;
}
но всё равно в некоторых строках нет совпадений с первой колонкой
Yandex
Объявления
05.08.2010, 15:26     Повтор случайного числа в строке матрицы
Ответ Создать тему
Опции темы

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