Light Knight
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
1

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

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

Author24 — интернет-сервис помощи студентам
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2010, 15:41
Ответы с готовыми решениями:

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

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

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

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

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

В первом сообщении найдете. Там есть под катом, генерация массива случайных чисел без повторения
1
Light Knight
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 15:54  [ТС] 3
с диапазоном разобрался, а вот с повторением не очень
0
Мат в 32 хода
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
04.08.2010, 16:03 4
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
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 16:43  [ТС] 5
nikkka, с этим уже разобрался, но немного другим способом, а как убрать повторения

Добавлено через 37 минут
а можно же по идее сделать цикл, в котором проверяются все предыдущие числа, и если такое число уже есть, то всё сначала...или нет?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 16:49 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
#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
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 16:49  [ТС] 7
спасибо) а нельзя ли как нибудь попроще?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 16:52 8
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
спасибо) а нельзя ли как нибудь попроще?
А что непонятного? Если что, то я могу объяснить алгоритм. Он в самом деле довольно простой
0
Light Knight
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 16:57  [ТС] 9
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.08.2010, 17:02 10
RoY_Mu$T@nG, Читайте STL.
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.08.2010, 17:03 11
Цитата Сообщение от Lavroff Посмотреть сообщение
Читайте STL.
там еще лямда выражение
0
Заблокирован
04.08.2010, 17:07 12
проинициализируй массив от 1 до 25 попорядку, а потом переставляй два числа случайным образом. 50шагов должно хватить
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,749
04.08.2010, 17:10 13
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
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 17:14  [ТС] 14
а что такое итератор х_х
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 17:16 15
Цитата Сообщение от 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
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 17:20  [ТС] 16
всё понятно, спасибо)
0
Nameless One
04.08.2010, 17:23
  #17

Не по теме:

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

0
0 / 0 / 0
Регистрация: 03.08.2010
Сообщений: 7
04.08.2010, 17:26 18
Цитата Сообщение от 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
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.08.2010, 17:40 19
Переделано с 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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.08.2010, 17:46 20
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
04.08.2010, 17:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2010, 17:46
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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