Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Aaxenon
Light Knight
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
#1

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

04.08.2010, 21:26. Просмотров 1205. Ответов 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;
}
вот программа, нужно доделать, чтобы в каждой строке повторялось одно число
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2010, 21:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Повтор случайного числа в строке матрицы (C++):

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

Корни квадратного уравнения, кратность случайного числа, процент от числа
Есть три задачи, если кто то когда то решал что подобное помогите плиз ...

Генерация случайного числа
Сори за вопрос может уже обсуждался не раз, но всё же возник. Как правильно...

Генерация случайного числа
Проблемма такова: в программе необходимо получить несколько чисел, от 1 до 255...

Время генерации случайного числа
Вопрос к опытным пользователям. Может кто подскажет время генерации случайного...

Генерация пятизначного случайного числа
Нужно сгенерировать случайное число из пяти цифр и записать ее в переменную...

21
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.08.2010, 21:28 #2
RoY_Mu$T@nG, Что-что что? Как это в каждой строке одно число? оО
Чтобы в i строке были все числа одним и тем же? Или чтобы не более одного повтора? Или же в каждой строке одно одинаковое число один раз?
0
Aaxenon
Light Knight
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 21:45  [ТС] #3
мне нужно чтобы в каждой строке был обязательно один повтор, но только один...и чтобы он выбирался случайно
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.08.2010, 21:51 #4
RoY_Mu$T@nG, ээ... а это возможно?
0
Aaxenon
Light Knight
106 / 29 / 5
Регистрация: 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;
}
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 22:26 #6
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
суть в том что выбрать случ. число для повтора и заполнить 2 случайные ячейки строки матрицы этим числом, затем при заполнении остальными числами пропускаем те клетки где уже стоит то самое число
я предлагаю поступить тебе иначе.
сначала заполняешь строку случайными значениями без повторов, что мы уже проделывали в другом топике.
потом рандомно выбираешь номер ячейки и копируешь значение из нее в другую случайно выбранную ячейку.
такую операцию провести со всеми строками.
0
Aaxenon
Light Knight
106 / 29 / 5
Регистрация: 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;
}
вот рабочий...но второй вариант тоже хочу..заполнить легко...как из одного в другое адрес перекинуть
0
MikeSoft
Эксперт С++
3917 / 1782 / 183
Регистрация: 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;
}
//---------------------------------------------------------------------------
1
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
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.
1
easybudda
05.08.2010, 10:34
  #10

Не по теме:

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

0
Aaxenon
Light Knight
106 / 29 / 5
Регистрация: 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
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
только обеспечь первое заполнение матрицы гарантированно без повторов
1
Aaxenon
Light Knight
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
05.08.2010, 13:58  [ТС] #13
а как осуществить проверку на повторяемость при заполнении
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
05.08.2010, 14:06 #14
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
а как осуществить проверку на повторяемость при заполнении
Генерируешь число, проверяешь, не равно ли это число предыдущим элементам текущим строки, и если не равно, то присваиваешь текущему элементу, в противном случае генерируешь новое число.
1
Aaxenon
Light Knight
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
05.08.2010, 14:13  [ТС] #15
как его сравнить с предыдущими...
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
05.08.2010, 14:19 #16
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
как его сравнить с предыдущими...
Сравнивай его с элементами, у который индекс меньше, чем у текущего элемента
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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].
1
Aaxenon
Light Knight
106 / 29 / 5
Регистрация: 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;
}
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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 включительно!
1
Aaxenon
Light Knight
106 / 29 / 5
Регистрация: 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;
}
но всё равно в некоторых строках нет совпадений с первой колонкой
0
05.08.2010, 15:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 15:26
Привет! Вот еще темы с решениями:

Вопрос по генерации случайного числа.
Здрасьте еще раз! На этот раз я никак не могу понять, как сделать генерацию...

Генерация случайного простого числа
Добрый вечер всем! У меня такая проблемма. Необходимо чтобы сгенерировалось 2...

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

Генерация случайного числа с плавающей чточкой
Добрый день. Подскажите как генерировать случайное число типа float или double....


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

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

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