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

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

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

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

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

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

Как заполнить массив из 4 чисел числами от 1 до 4 без повторений - C++
Как мне заполнить массив при помощи рандома? Чтобы на выходе у меня были комбинации примерно такие. int Array =...

Функция, заполняющая массив псевдослучайными числами в заданном пользователем диапазоне без повторений - C++
Тема: Функции2. 4. Реализовать функцию RandWithoutRepetition, с помощью которой можно было бы заполнить массив псевдослучайными числами в...

Заполнение массива числами - C++
Здравствуйте, есть набор чисел (3, 3.5, 4 ,4.5, 5) требуется заполнить массив который заполняется случаными образом этими числами....

Заполнение двухмерного массива числами от 1 до 9 - C++
дан массив a надо по функции rand заполнить матриц числами от 1 до 9 и подсчитать сколько строк в нем есть в которых все числа от 1...

Заполнение массива случайными числами - C++
Подскажите пожалуйста, как заполнить массив случайными числами в div-C++? Программа выдает ошибку=( #include &lt;cstdlib&gt; #include...

24
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
04.08.2010, 15:45 #2
http://www.cyberforum.ru/cpp-beginners/thread44753.html

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

Добавлено через 37 минут
а можно же по идее сделать цикл, в котором проверяются все предыдущие числа, и если такое число уже есть, то всё сначала...или нет?
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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
Aaxenon
Light Knight
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 16:49  [ТС] #7
спасибо) а нельзя ли как нибудь попроще?
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
04.08.2010, 16:52 #8
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
спасибо) а нельзя ли как нибудь попроще?
А что непонятного? Если что, то я могу объяснить алгоритм. Он в самом деле довольно простой
0
Aaxenon
Light Knight
106 / 29 / 3
Регистрация: 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
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
04.08.2010, 17:02 #10
RoY_Mu$T@nG, Читайте STL.
1
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 17:03 #11
Цитата Сообщение от Lavroff Посмотреть сообщение
Читайте STL.
там еще лямда выражение
0
Dzhej-Dzhej
Заблокирован
04.08.2010, 17:07 #12
проинициализируй массив от 1 до 25 попорядку, а потом переставляй два числа случайным образом. 50шагов должно хватить
1
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5613 / 952
Регистрация: 25.07.2009
Сообщений: 10,776
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
Aaxenon
Light Knight
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
04.08.2010, 17:14  [ТС] #14
а что такое итератор х_х
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2010, 17:16
Привет! Вот еще темы с ответами:

Заполнение массива тремя числами - C++
Как поставить проверку на ввод чисел? Что бы матрицу NxM можно было заполнить только тремя цифрами (1,0,-1) Как это на Си будет...

Заполнение массива случайными числами - C++
Доброго времени суток. Перейду сразу к сути: Надо построить массив из 5000 целых случайных чисел и отсортировать его сортировкой Шелла, ...

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

Заполнение динамического массива числами от -50 до 50! - C++
Плиз помогите Заполненить динамический массив числами от -50 до 50!буду очень признателен


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
04.08.2010, 17:16
Ответ Создать тему
Опции темы

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