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

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

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

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

04.08.2010, 21:26. Просмотров 1162. Ответов 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++):

Генерация случайного числа, максимально случайного - C++
Добрый день, задался вопросом как получить случайное число, но не псевдо-случайное по идее функции rand() и srand(time(NULL))...

Корни квадратного уравнения, кратность случайного числа, процент от числа - C++
Есть три задачи, если кто то когда то решал что подобное помогите плиз 1)Даны 3 вещественных числа. Найти корни квадратного уравнения...

Генерация случайного числа - C++
Сори за вопрос может уже обсуждался не раз, но всё же возник. Как правильно сгенерировать число от 0 до 1 и какой тип данных лучше...

Генерация случайного числа - C++
Проблемма такова: в программе необходимо получить несколько чисел, от 1 до 255 (или max будет другим -- пока не важно). Стандартные...

Генерация пятизначного случайного числа - C++
Нужно сгенерировать случайное число из пяти цифр и записать ее в переменную типа string. Пытаюсь 5 генерировать цифры в цикле, а как их...

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

21
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
04.08.2010, 21:28 #2
RoY_Mu$T@nG, Что-что что? Как это в каждой строке одно число? оО
Чтобы в i строке были все числа одним и тем же? Или чтобы не более одного повтора? Или же в каждой строке одно одинаковое число один раз?
0
Aaxenon
Light Knight
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 21:45  [ТС] #3
мне нужно чтобы в каждой строке был обязательно один повтор, но только один...и чтобы он выбирался случайно
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
04.08.2010, 21:51 #4
RoY_Mu$T@nG, ээ... а это возможно?
0
Aaxenon
Light Knight
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;
}
0
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 22:26 #6
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
суть в том что выбрать случ. число для повтора и заполнить 2 случайные ячейки строки матрицы этим числом, затем при заполнении остальными числами пропускаем те клетки где уже стоит то самое число
я предлагаю поступить тебе иначе.
сначала заполняешь строку случайными значениями без повторов, что мы уже проделывали в другом топике.
потом рандомно выбираешь номер ячейки и копируешь значение из нее в другую случайно выбранную ячейку.
такую операцию провести со всеми строками.
0
Aaxenon
Light Knight
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;
}
вот рабочий...но второй вариант тоже хочу..заполнить легко...как из одного в другое адрес перекинуть
0
MikeSoft
Эксперт С++
3801 / 1777 / 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;
}
//---------------------------------------------------------------------------
1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 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 / 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
0
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 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 / 3
Регистрация: 03.06.2010
Сообщений: 361
05.08.2010, 13:58  [ТС] #13
а как осуществить проверку на повторяемость при заполнении
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
05.08.2010, 14:06 #14
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
а как осуществить проверку на повторяемость при заполнении
Генерируешь число, проверяешь, не равно ли это число предыдущим элементам текущим строки, и если не равно, то присваиваешь текущему элементу, в противном случае генерируешь новое число.
1
Aaxenon
Light Knight
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
05.08.2010, 14:13  [ТС] #15
как его сравнить с предыдущими...
0
05.08.2010, 14:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 14:13
Привет! Вот еще темы с ответами:

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

Вопрос по генерации случайного числа. - C++
Здрасьте еще раз! На этот раз я никак не могу понять, как сделать генерацию случайных чисел (заполнение массива), которая зависит от...

Запись текста и генерация случайного числа - C++
Собственно задача такая: записать строки с рандомными числовым значением в некоторое количество создаваймых файлов. Файлы создаются без...

Реализовать алгоритм генерации случайного числа - C++
Необходимо реализовать алгоритм генерации случайного числа. Прочитал, что нужна зависимость от времени/координаты положения курсора. Но как...


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

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

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