С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/117: Рейтинг темы: голосов - 117, средняя оценка - 4.77
Light Knight
 Аватар для Aaxenon
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361

Заполнение массива числами от 1 до 25 без повторений

04.08.2010, 15:41. Показов 24087. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
    const int ROW=5;
    const int COLUMN=5;
    int MAS[ROW][COLUMN];
    srand(time (NULL));
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COLUMN; j++)
        {
            MAS[i][j] = rand()%26;
            cout << MAS[i][j] << "\t\t";
        }
        cout << endl << endl << endl << endl << endl;
    }
    system("PAUSE");
    return 0;
}
вот программа, но она заполняет от 0, а не от 1 и повторяет числа, как исправить?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.08.2010, 15:41
Ответы с готовыми решениями:

Заполнение массива рандомными числами без повторений
Здравствуйте! Пытаюсь заполнить массив рандомными числами без повторений, в коде есть проверка на уникальность числа, но массив все равно...

Заполнение массива случайными числами без повторений
Как сгенерировать массив от 1 до 15, чтобы ни одно число в массиве не повторялось и последовательность была случайной ?

Рекурсия: заполнение одномерного массива целыми случайными числами без повторений
Помогите, пожалуйста, с задачей. 1. Описать функцию для заполнения одномерного массива целыми случайными числами без повторений....

24
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.08.2010, 15:45
https://www.cyberforum.ru/cpp-... 44753.html

В первом сообщении найдете. Там есть под катом, генерация массива случайных чисел без повторения
1
Light Knight
 Аватар для Aaxenon
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 15:54  [ТС]
с диапазоном разобрался, а вот с повторением не очень
0
Мат в 32 хода
 Аватар для nikkka
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
04.08.2010, 16:03
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
    const int ROW=5;
    const int COLUMN=5;
    int MAS[ROW][COLUMN];
    srand(time (NULL));
    for (int i = 0; i < ROW; i++)
        {
        for (int j = 0; j < COLUMN; j++)
                {
            MAS[i][j] = rand()%25+1;
            cout << MAS[i][j] << "\t\t";
                }
        cout << endl << endl << endl << endl << endl;
        }
        system("PAUSE");
    return 0;
}
1
Light Knight
 Аватар для Aaxenon
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 16:43  [ТС]
nikkka, с этим уже разобрался, но немного другим способом, а как убрать повторения

Добавлено через 37 минут
а можно же по идее сделать цикл, в котором проверяются все предыдущие числа, и если такое число уже есть, то всё сначала...или нет?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 16:49
Я вот до такого додумался:
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
#include <iostream>
#include <ctime>
#include <vector>
#include <algorithm>
#include <iomanip>
 
int main()
{
    srand(static_cast<size_t>(time(NULL)));
    const size_t ROW = 5;
    const size_t COL = 5;
    //Наш массив
    size_t arr[ROW][COL];
    //Создаем вектор, который будет хранить "случайные" значения
    std::vector<size_t> rnd(ROW * COL);
    size_t var = 1;
    //... и заполняем его
    std::generate(rnd.begin(), rnd.end(), [&]() { return var++; });
    for(size_t i = 0; i < ROW; ++i)
        for(size_t j = 0; j < COL; ++j)
            if(i * j == (ROW - 1) * (COL - 1)) // Если последний элемент
                arr[i][j] = *(rnd.begin());
            else
            {
                std::vector<size_t>::const_iterator it = rnd.begin() + rand() % rnd.size(); // Выбираем произвольный элемент из вектора
                arr[i][j] = *it;
                rnd.erase(it); // И удаляем его
            }
    for(size_t i = 0; i < ROW; ++i, std::cout << std::endl)
        for(size_t j = 0; j < COL; ++j)
            std::cout << std::left << std::setw(7) << arr[i][j];
    system("pause");
    return EXIT_SUCCESS;
}
Добавлено через 4 минуты
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
а можно же по идее сделать цикл, в котором проверяются все предыдущие числа, и если такое число уже есть, то всё сначала...или нет?
Такой цикл теоретически может длиться бесконечно.
1
Light Knight
 Аватар для Aaxenon
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 16:49  [ТС]
спасибо) а нельзя ли как нибудь попроще?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 16:52
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
спасибо) а нельзя ли как нибудь попроще?
А что непонятного? Если что, то я могу объяснить алгоритм. Он в самом деле довольно простой
0
Light Knight
 Аватар для Aaxenon
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 16:57  [ТС]
C++
1
2
#include <algorithm>
#include <iomanip>
вот эти две библиотеки мне вообще не ясны
C++
1
 std::generate(rnd.begin(), rnd.end(), [&]() { return var++; });
вот эта строка
C++
1
std::vector<size_t>::const_iterator it = rnd.begin() + rand() % rnd.size();
и вот эта
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.08.2010, 17:02
RoY_Mu$T@nG, Читайте STL.
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
04.08.2010, 17:03
Цитата Сообщение от Lavroff Посмотреть сообщение
Читайте STL.
там еще лямда выражение
0
Заблокирован
04.08.2010, 17:07
проинициализируй массив от 1 до 25 попорядку, а потом переставляй два числа случайным образом. 50шагов должно хватить
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
04.08.2010, 17:10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <ctime>
 
int main(){
    const int SIZE = 25;
    int arr[SIZE];
 
    for ( int i = 0; i < SIZE; ++i )
        arr[i] = i + 1;
 
    srand(time(NULL));
    std::random_shuffle(arr, arr + SIZE);
 
    std::copy(arr, arr + SIZE, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    return 0;
}
2
Light Knight
 Аватар для Aaxenon
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 17:14  [ТС]
а что такое итератор х_х
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 17:16
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
вот эти две библиотеки мне вообще не ясны
algorithm - нужна для функции generate.
iomanip - для форматирования вывода с помощью манипуляторов std::left, std::setw()

Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
std::generate(rnd.begin(), rnd.end(), [&]() { return var++; });
Алгоритм генерирует значения для заполнения вектора. Для заполнения используется лямбда-функция (анонимная функция) [&]() { return var++; }, которая при каждом вызове возвращает возрастающее с шагом в 1 значение var. Вместо этого, можно было бы определить функцию
C++
1
2
3
4
5
size_t f()
{
    static size_t var = 1;
    return var++;
}
И передавать эту функцию в алгоритм вместо лямбда-функции.
Можно также вместо generate написать:
C++
1
2
for(size_t i = 0; i < ROW * COL; ++i)
    rnd[i] = i + 1;
Эффект будет тот же.
std::vector<size_t>::const_iterator it = rnd.begin() + rand() % rnd.size();
Т.к. границы диапазона случайных чисел нам известны, как и то, что каждое число из диапазона должно встречаться только один раз, то получается, что "случайными" здесь являются не возможные числа, а порядок их присваивания очередному элементу матрицы.
Вектор rnd инициализирован числами от 1 до 25. В цикле мы получаем псевдослучайное число от 0 до (размер вектора - 1), которое является порядковым номером очередного элемента вектора. Прибавляя к начальному итератору вектора (можно считать, что это указатель на первый элемент вектора) этот номер, мы получаем итератор (указатель) на очередной элемент вектора. После мы присваиваем элемент, на который указывает итератор, после чего удаляем этот элемент. Таким образом, мы случайным образом распределяем элементы вектора между элементами матрицы.

Добавлено через 1 минуту
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
а что такое итератор х_х
Можно для простоты считать, что это указатель.
1
Light Knight
 Аватар для Aaxenon
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 17:20  [ТС]
всё понятно, спасибо)
0
04.08.2010, 17:23

Не по теме:

easybudda, как все оказалось просто...

0
0 / 0 / 0
Регистрация: 03.08.2010
Сообщений: 7
04.08.2010, 17:26
Цитата Сообщение от 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
27
28
29
30
31
32
33
34
35
36
37
include <iostream>
include <ctime>
 
using namespace std;
 
int main()
{
    const int ROW = 5, COLUMN = 5;
    int MAS[ROW][COLUMN];
    int array1[26];  // создаем массив, в котором по индексу [I]к[/I] будет храниться 0 или 1
    int k; // собственно индекс [I]к[/I]
 
    for (int g=0; g< 26; g++) {  array1[g]=0; } // обнуляем массив
 
    srand(time(NULL));
    for (int i=0; i < ROW; i++)
           {
        for (int j=0; j< COLUMN; j++)
        {
 
//проверка на единственность
            while(1)
            {
        k = rand()%25 + 1;
        if ( array1[k] == 0 ) { array1[k] = 1; MAS[i][j] = k; break; } 
                        }
        cout << MAS[i][j] << "\t\t";
           }
        cout << endl<< endl<< endl<< endl<< endl;
    
    }
 
 
    system ("Pause");
 
    return 0;
}

Вот как-то так.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 17:40
Переделано с std::random_shuffle
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 <ctime>
#include <vector>
#include <algorithm>
#include <iomanip>
 
int main()
{
    srand(static_cast<size_t>(time(NULL)));
    const size_t ROW = 5;
    const size_t COL = 5;
    size_t arr[ROW][COL];
    size_t *ptr = &arr[0][0];
    std::vector<size_t> rnd(ROW * COL);
    size_t var = 1;
    std::generate(rnd.begin(), rnd.end(), [&]() { return var++; });
    std::random_shuffle(rnd.begin(), rnd.end());
    std::vector<size_t>::const_iterator it = rnd.begin();
    while(it != rnd.end())
        *ptr++ = *it++;
    for(size_t i = 0; i < ROW; ++i, std::cout << std::endl)
        for(size_t j = 0; j < COL; ++j)
            std::cout << std::left << std::setw(7) << arr[i][j];
    system("pause");
    return EXIT_SUCCESS;
}
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
04.08.2010, 17:46
Nameless One, я только не понял зачем здесь еще и вектор?
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 <algorithm>
#include <iomanip>
 
int main()
{
    const size_t ROW = 5;
    const size_t COL = 5;
 
    int arr[ROW][COL];
 
    for(int i = 0; i < ROW; ++i)
    {
        std::generate(arr[i], arr[i] + COL, [&]() { return rand() % 99; });
        std::random_shuffle(arr[i], arr[i] + COL);
    }
 
    for(int i = 0; i < ROW; ++i)
    {
        std::for_each(arr[i], arr[i] + COL, [](int n){ std::cout << std::setw(3) << n; });
        std::cout << std::endl;
    }
 
    system("pause");
    return EXIT_SUCCESS;
}
к тому же, если память выделить динамически под матрицу, то вот этот кусок может привести к ошибке.
C++
1
2
        while(it != rnd.end())
                *ptr++ = *it++;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.08.2010, 17:46
Помогаю со студенческими работами здесь

Заполнение квадрата последовательными числами без повторений
Квадрат размером n x n разделен на клетки; в некоторых клетках записаны числа от 1 до{n}^{2}(1 и {n}^{2} присутствуют всегда). Нужно...

Заполнение элементов вектора рандомными числами без повторений
Требуется заполнить 15 элементов вектора числами с 1 до 15, а последний элемент нулем Главное, чтобы числа не повторялись и все это...

Заполнение массива случайными значениями без повторений
Ребят помогите!Вот такая задачка: Напишите программу, которая заполняет массив из 100 элементов целочисленными, случайными значениями в...

Заполнение массива случайными числами без повтора
Здравствуйте. Не выходит заполнить массив случайными числами без повтора. Когда открываю его в браузере, то страничка подвисает.. наверное...

Заполнение массива случайными числами, но без нулей
Здравствуйте все. Должны быть числа и отрицательные и положительные, но без нулей! Вот написал. Но тупо. Как сделать лучше? for (int...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru