Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
1

Генератор чисел в поразрядной сортировке

04.03.2019, 16:04. Просмотров 1378. Ответов 39
Метки нет (Все метки)

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "iostream"
#include "windows.h"
using namespace std;
int n, col_razr=0;
int max_razr(int chislo)
{
    int max=0;
    while(chislo>1)
        {
                chislo/=10;
                max++;
        }
    return max;
}
 
int velich_razr(int chislo,int razr)
{
        while(razr>1)
        {
                chislo/=10;
                razr--;
        }
        return chislo%10;
}
 
void sort_razr(int **dop_mas, int *mas, int razr)
{
        int *mas_col, i,j, temp=0;
        mas_col=new int[n];
        for(i=0; i<n; i++)
                mas_col[i]=0;
        for(i=0; i<n; i++)
        {
                int a=velich_razr(mas[i], razr);
                dop_mas[mas_col[a]][a]=mas[i];
                mas_col[a]++;
        }
        for(i=0; i<n; i++)
        {
                for(j=0; j<mas_col[i]; j++)
                {
                        mas[temp]=dop_mas[j][i];
                        temp++;
                }
        }
}
 
int main()
{
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        int razr, i, *mas, **dop_mas;
        cout<<"Введите размер последовательности: "<< endl;
        cin>>n;
        mas=new int[n];
        cout<<"Введите элементы последовательности: "<< endl;
        for(i=0; i<n; i++)
        {
            cout<<"["<<i+1<<"]= ";
            cin>>mas[i];
        }
        dop_mas=new int*[n];
        for(i=0; i<n; i++)
        dop_mas[i]=new int[n];
        for(i=0; i<n; i++)
            if(col_razr<max_razr(mas[i]))
                col_razr=max_razr(mas[i]);
        for(razr=1; razr<=col_razr; razr++)
                sort_razr(dop_mas, mas, razr);
        for(i=0; i<n; i++)
                cout<<mas[i]<<endl;
        return 0;
}
Как сделать чтобы вместо выбора и введения элементов , сделать рандом чисел в диапазоне от 0 до n ,где n может быть 1млн или даже больше
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2019, 16:04
Ответы с готовыми решениями:

Интерпретация отрицательных чисел в сортировке
Здравствуйте, уважаемые форумчане и знатоки c++. Имеется lsd поразрядная сортировка для целых...

помогите с поразрядной сортировкой
необходимо отсортировать методом поразрядной сортировки слова естественного языка.никак не...

Метод поразрядной сортировки.
Помогите решить задачу, для её решения необходимо реализовать метод поразрядной сортировки,...

Проблемы с поразрядной сортировкой msd
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;clocale&gt; using namespace std; int main(int...

Генератор чисел
Народ подскажыте пожалуста как создать свой генератор чисел.

39
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 16:25 2
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
/* заполнение произвольного одномерного контейнера с элементами произвольного типа произвольно распределенными случайными числами */
template <class ForwardIterator, class Distribution>
void random_array_fill(ForwardIterator begin, ForwardIterator end, Distribution&& dist) {
    std::random_device rd;
    std::mt19937 gen(rd());
    for (; begin != end; ++begin) *begin = dist(gen);
}
 
int main()
{
    /* классический массив целых чисел */
    int a[10];
    random_array_fill(std::begin(a), std::end(a), std::uniform_int_distribution<int>(1, 100));
    /* классический массив вещественных чисел */
    float b[20];
    random_array_fill(std::begin(b), std::end(b), std::uniform_real_distribution<float>(-1.0, 1.0));
    /* вектор */
    std::vector<int> v(10, 0);
    random_array_fill(std::begin(v), std::end(v), std::poisson_distribution<int>(10));
    /* двусвязный список */
    std::list<double> l(10, 0);
    random_array_fill(std::begin(l), std::end(l), std::normal_distribution<double>(10.0, 1.5));
    return 0;
}
0
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
04.03.2019, 16:36  [ТС] 3
Чето я не понял, мне нужен рандом целых чисел вот тут
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
int main()
{
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        int razr, i, *mas, **dop_mas;
        cout<<"Введите размер последовательности: "<< endl;
        cin>>n;
        mas=new int[n];
        cout<<"Введите элементы последовательности: "<< endl;
        for(i=0; i<n; i++)
        {
            cout<<"["<<i+1<<"]= ";
            cin>>mas[i];
        }
        dop_mas=new int*[n];
        for(i=0; i<n; i++)
        dop_mas[i]=new int[n];
        for(i=0; i<n; i++)
            if(col_razr<max_razr(mas[i]))
                col_razr=max_razr(mas[i]);
        for(razr=1; razr<=col_razr; razr++)
                sort_razr(dop_mas, mas, razr);
        for(i=0; i<n; i++)
                cout<<mas[i]<<endl;
        return 0;
}
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 16:41 4
Цитата Сообщение от myfurms Посмотреть сообщение
Чето я не понял, мне нужен рандом целых чисел вот тут
Так я и привел шаблон, который рандомом заполняет одномерный массив. И варианты его использования.
Заполнить матрицу можно вот так:

C++
1
2
3
4
5
6
7
8
/* заполнение произвольного двумерного контейнера с элементами произвольного типа произвольно распределенными случайными числами */
template <class ForwardIterator, class Distribution>
void random_matrix_fill(ForwardIterator first_row, ForwardIterator past_last_row, Distribution&& dist) {
    while (first_row != past_last_row) {
        random_array_fill(std::begin(*first_row), std::end(*first_row), std::forward<Distribution>(dist));
        ++first_row;
    }
}
0
04.03.2019, 16:41
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
04.03.2019, 16:43  [ТС] 5
Просто я не понимаю как это засунуть в свой код
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 16:50 6
Например, вот так:

C++
1
random_array_fill(mas, mas + n, std::uniform_int_distribution<int>(1, 100));
0
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
04.03.2019, 17:46  [ТС] 7
C++
1
2
3
4
5
6
7
8
9
int razr, i, *mas, **dop_mas;
        cout<<"Введите размер диапазона рандомных чисел: "<< endl;
        cin>>n;
        template <class ForwardIterator, class Distribution>
    void random_array_fill(mas, mas + n, std::uniform_int_distribution<int>(1, 100)) {
    std::random_device rd;
    std::mt19937 gen(rd());
    for (; mas != mas + n; ++mas) *mas = dist(gen);
        mas=new int[n];
так? в первый раз вижу такое

Добавлено через 42 минуты
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>
using namespace std;
int n, col_razr=0;
int max_razr(int chislo)
{
    int max=0;
    while(chislo>1)
        {
                chislo/=10;
                max++;
        }
    return max;
}
 
int velich_razr(int chislo,int razr)
{
        while(razr>1)
        {
                chislo/=10;
                razr--;
        }
        return chislo%10;
}
 
void sort_razr(int **dop_mas, int *mas, int razr)
{
        int *mas_col, i,j, temp=0;
        mas_col=new int[n];
        for(i=0; i<n; i++)
                mas_col[i]=0;
        for(i=0; i<n; i++)
        {
                int a=velich_razr(mas[i], razr);
                dop_mas[mas_col[a]][a]=mas[i];
                mas_col[a]++;
        }
        for(i=0; i<n; i++)
        {
                for(j=0; j<mas_col[i]; j++)
                {
                        mas[temp]=dop_mas[j][i];
                        temp++;
                }
        }
}
 
int main()
{
        setlocale(LC_ALL, "rus");
        int razr, i, *mas, **dop_mas;
        cout<<"Введите диапазон чисел: "<< endl;
        cin>>n;
        mas=new int[n];
                        
  
        
         for(int i=0; i<n; i++)
 {
 mas[i] = rand()%n; 
std::cout << mas[i];
 }
    
        dop_mas=new int*[n];
        for(i=0; i<n; i++)
        dop_mas[i]=new int[n];
        for(i=0; i<n; i++)
            if(col_razr<max_razr(mas[i]))
                col_razr=max_razr(mas[i]);
        for(razr=1; razr<=col_razr; razr++)
                sort_razr(dop_mas, mas, razr);
        for(i=0; i<n; i++)
                cout<<mas[i]<<endl;
        return 0;
}
Я вот так добавил рандом, но как то коряво работает, в чем ошибка?
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 18:06 8
Не туда шаблон вставил. Его надо перед функцией main лепить без изменений. Можешь со строки 15 в свой код его вставить. Это будет между другими функциями.
1
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
04.03.2019, 18:19  [ТС] 9
Блин покажи конкретно как мне рандом сделать конкретно на моем коде, я уже запутался , у меня ни так ни так не получилось
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 18:33 10
Ну вот сюда вставляешь...

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <windows.h>
#include <random>
 
using namespace std;
int n, col_razr = 0;
int max_razr(int chislo)
{
    int max = 0;
    while (chislo > 1)
    {
        chislo /= 10;
        max++;
    }
    return max;
}
 
int velich_razr(int chislo, int razr)
{
    while (razr > 1)
    {
        chislo /= 10;
        razr--;
    }
    return chislo % 10;
}
 
/* заполнение произвольного одномерного контейнера с элементами произвольного типа произвольно распределенными случайными числами */
template <class ForwardIterator, class Distribution>
void random_array_fill(ForwardIterator begin, ForwardIterator end, Distribution&& dist) {
    std::random_device rd;
    std::mt19937 gen(rd());
    for (; begin != end; ++begin) *begin = dist(gen);
}
 
void sort_razr(int **dop_mas, int *mas, int razr)
{
    int *mas_col, i, j, temp = 0;
    mas_col = new int[n];
    for (i = 0; i < n; i++)
        mas_col[i] = 0;
    for (i = 0; i < n; i++)
    {
        int a = velich_razr(mas[i], razr);
        dop_mas[mas_col[a]][a] = mas[i];
        mas_col[a]++;
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < mas_col[i]; j++)
        {
            mas[temp] = dop_mas[j][i];
            temp++;
        }
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int razr, i, *mas, **dop_mas;
    cout << "Введите размер последовательности: " << endl;
    cin >> n;
    mas = new int[n];
    /*
    cout << "Введите элементы последовательности: " << endl;
    for (i = 0; i < n; i++)
    {
        cout << "[" << i + 1 << "]= ";
        cin >> mas[i];
    }
    */
    random_array_fill(mas, mas + n, std::uniform_int_distribution<int>(1, 100));
 
    dop_mas = new int*[n];
    for (i = 0; i < n; i++)
        dop_mas[i] = new int[n];
    for (i = 0; i < n; i++)
        if (col_razr < max_razr(mas[i]))
            col_razr = max_razr(mas[i]);
    for (razr = 1; razr <= col_razr; razr++)
        sort_razr(dop_mas, mas, razr);
    for (i = 0; i < n; i++)
        cout << mas[i] << endl;
    return 0;
}
Остальные косяки сам устранишь. Удаление массивов добавь в конец программы.
0
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
04.03.2019, 18:46  [ТС] 11
А почему он не сортирует? и мне же нужен рандом до 1 000 000 и больше, а тут всего диапазон 100
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 18:52 12
Цитата Сообщение от myfurms Посмотреть сообщение
А почему он не сортирует?
1. Потому что ты не запрограммировал его на сортировку. Я показал лишь как заполнить массив случайными числами. О сортировке речи не шло. Но это тоже несложно. Есть стандартные сортировщики, например, sort.
2. Чтоб было до 1000000, делай так:

C++
1
 random_array_fill(mas, mas + n, std::uniform_int_distribution<int>(1, 1000000));
0
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
04.03.2019, 18:56  [ТС] 13
Мне нужна поразрядная сортировка, она есть в моем коде, только когда я добавил этот рандом она перестала работать, в чем дело?
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 18:59 14
Цитата Сообщение от myfurms Посмотреть сообщение
Мне нужна поразрядная сортировка, она есть в моем коде, только когда я добавил этот рандом она перестала работать, в чем дело?
Мы заменили ввод с клавиатуры на случайное заполнение массива. Сортировка от этого пострадать не должна была.
Поясни, что имеется в виду под "поразрядной" сортировкой, чтоб моя помощь была более целенаправленной.
0
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
04.03.2019, 19:01  [ТС] 15
А как вывести на экран числа которые рандомит эта функция?
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 19:21 16
Цитата Сообщение от myfurms Посмотреть сообщение
А как вывести на экран числа которые рандомит эта функция?
В цикле for от 0 до n-1...
C++
1
for (i = 0; i < n; i++) std::cout << mas[i] << " ";
1
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
04.03.2019, 19:32  [ТС] 17
А почему так долго компилируется когда ввожу
C++
1
 random_array_fill(mas, mas + n, std::uniform_int_distribution<int>(1, 10000));
большое число вместо 100

Добавлено через 4 минуты
МБ стоит взять другую функцию рандома?
как например вот тут я делал, но я тут ошибся где то
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>
using namespace std;
int n, col_razr=0;
int max_razr(int chislo)
{
    int max=0;
    while(chislo>1)
        {
                chislo/=10;
                max++;
        }
    return max;
}
 
int velich_razr(int chislo,int razr)
{
        while(razr>1)
        {
                chislo/=10;
                razr--;
        }
        return chislo%10;
}
 
void sort_razr(int **dop_mas, int *mas, int razr)
{
        int *mas_col, i,j, temp=0;
        mas_col=new int[n];
        for(i=0; i<n; i++)
                mas_col[i]=0;
        for(i=0; i<n; i++)
        {
                int a=velich_razr(mas[i], razr);
                dop_mas[mas_col[a]][a]=mas[i];
                mas_col[a]++;
        }
        for(i=0; i<n; i++)
        {
                for(j=0; j<mas_col[i]; j++)
                {
                        mas[temp]=dop_mas[j][i];
                        temp++;
                }
        }
}
 
int main()
{
        setlocale(LC_ALL, "rus");
        int razr, i, *mas, **dop_mas;
        cout<<"Введите диапазон чисел: "<< endl;
        cin>>n;
        mas=new int[n];
                        
  
        
         for(int i=0; i<n; i++)
 {
 mas[i] = rand()%n; 
std::cout << mas[i];
 }
    
        dop_mas=new int*[n];
        for(i=0; i<n; i++)
        dop_mas[i]=new int[n];
        for(i=0; i<n; i++)
            if(col_razr<max_razr(mas[i]))
                col_razr=max_razr(mas[i]);
        for(razr=1; razr<=col_razr; razr++)
                sort_razr(dop_mas, mas, razr);
        for(i=0; i<n; i++)
                cout<<mas[i]<<endl;
        return 0;
}
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 19:53 18
Функция работает быстро. И "случайность" хорошая получается. rand - это плохой генератор.

Добавлено через 9 минут
Ты бы дал условие задачи, я помогу основательнее. Сложно что-то внедрять в чужой код, тем более когда он далек от идеала...

Добавлено через 15 секунд
Ты бы дал условие задачи, я помогу основательнее. Сложно что-то внедрять в чужой код, тем более когда он далек от идеала...
1
myfurms
1 / 1 / 0
Регистрация: 27.02.2019
Сообщений: 35
04.03.2019, 21:38  [ТС] 19
Мучаюсь уже несколько дней, а сдавать уже скоро.
Вот условие задачи. Нужно сделать программу которая генерирует n случайных чисел в диапазоне от 0 до n ( то есть программа запрашивает у пользователя n ---> пользователь вводит(n мб очень большое 1-3 миллиона) ---->программа генерирует случайные цифры в заданном диапазоне и записывает их в файл1, затем выполняет поразрядную сортировку и записывает отсортированные числа в файл2.
----------
Буду рад если поможете довести доума программу
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
04.03.2019, 21:45 20
Цитата Сообщение от myfurms Посмотреть сообщение
Мучаюсь уже несколько дней, а сдавать уже скоро.
Поможем, не боись! Только непонятно, зачем еще какие-то цифры в заданном диапазоне? И что значит "поразрядная" сортировка? Есть сортировка по убыванию/возрастанию, по ключу и т.д. Может все-таки просто сортировка по возрастанию? Задание очень неточно сформулировано.
1
04.03.2019, 21:45
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2019, 21:45

генератор чисел
Прошу Вас помочь мне в написание лабораторной работы, мне нужна на языке С Написать генератор...

Генератор чисел!
Всем доброго времени суток. Нужна помощь, является задача сгенерировать матрицуNхM случайных чисел...

генератор чисел
здравствуйте, уважаемые форумчане! есть вопрос - возможно ли сделать генератор случайных чисел с...


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

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

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