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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 64, средняя оценка - 4.81
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 15:41     Заполнение массива числами от 1 до 25 без повторений #1
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 и повторяет числа, как исправить?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2010, 15:41     Заполнение массива числами от 1 до 25 без повторений
Посмотрите здесь:

C++ Заполнение массива случайными числами
C++ Заполнение массива комплексными числами
Заполнение массива числами C++
Заполнение массива случайными числами C++
Заполнение массива числами Фибоначчи C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 15:45     Заполнение массива числами от 1 до 25 без повторений #2
http://www.cyberforum.ru/cpp-beginners/thread44753.html

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

Добавлено через 37 минут
а можно же по идее сделать цикл, в котором проверяются все предыдущие числа, и если такое число уже есть, то всё сначала...или нет?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.08.2010, 16:49     Заполнение массива числами от 1 до 25 без повторений #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 Посмотреть сообщение
а можно же по идее сделать цикл, в котором проверяются все предыдущие числа, и если такое число уже есть, то всё сначала...или нет?
Такой цикл теоретически может длиться бесконечно.
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 16:49  [ТС]     Заполнение массива числами от 1 до 25 без повторений #7
спасибо) а нельзя ли как нибудь попроще?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.08.2010, 16:52     Заполнение массива числами от 1 до 25 без повторений #8
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
спасибо) а нельзя ли как нибудь попроще?
А что непонятного? Если что, то я могу объяснить алгоритм. Он в самом деле довольно простой
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 16:57  [ТС]     Заполнение массива числами от 1 до 25 без повторений #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();
и вот эта
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 17:02     Заполнение массива числами от 1 до 25 без повторений #10
RoY_Mu$T@nG, Читайте STL.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 17:03     Заполнение массива числами от 1 до 25 без повторений #11
Цитата Сообщение от Lavroff Посмотреть сообщение
Читайте STL.
там еще лямда выражение
Dzhej-Dzhej
Заблокирован
04.08.2010, 17:07     Заполнение массива числами от 1 до 25 без повторений #12
проинициализируй массив от 1 до 25 попорядку, а потом переставляй два числа случайным образом. 50шагов должно хватить
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.08.2010, 17:10     Заполнение массива числами от 1 до 25 без повторений #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;
}
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 17:14  [ТС]     Заполнение массива числами от 1 до 25 без повторений #14
а что такое итератор х_х
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.08.2010, 17:16     Заполнение массива числами от 1 до 25 без повторений #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 Посмотреть сообщение
а что такое итератор х_х
Можно для простоты считать, что это указатель.
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 17:20  [ТС]     Заполнение массива числами от 1 до 25 без повторений #16
всё понятно, спасибо)
Nameless One
04.08.2010, 17:23
  #17

Не по теме:

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

sla000
0 / 0 / 0
Регистрация: 03.08.2010
Сообщений: 7
04.08.2010, 17:26     Заполнение массива числами от 1 до 25 без повторений #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;
}

Вот как-то так.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.08.2010, 17:40     Заполнение массива числами от 1 до 25 без повторений #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2010, 17:46     Заполнение массива числами от 1 до 25 без повторений
Еще ссылки по теме:

Заполнение элементов вектора рандомными числами без повторений C++
C++ Заполнение двухмерного массива числами от 1 до 9
Как заполнить массив из 4 чисел числами от 1 до 4 без повторений C++

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 17:46     Заполнение массива числами от 1 до 25 без повторений #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++;
Yandex
Объявления
04.08.2010, 17:46     Заполнение массива числами от 1 до 25 без повторений
Ответ Создать тему
Опции темы

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