Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
1

Создать шаблонную функцию для генерации рандомных чисел

31.01.2017, 18:53. Показов 2384. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код, который заполняет вектор случайными значениями типа int.

Можно ли сделать шаблон для функции random_number, чтобы она заполняла как int'ами, так и double'ми и т.д.?
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
template<class T>
T random_number()
{
    static const int FROM_NUM = 1;
    static const int TO_NUM = 9;
    static std::mt19937 generator((unsigned)time(nullptr));
    std::uniform_int_distribution<T> dist(FROM_NUM, TO_NUM);
    return dist(generator);
}
 
int main()
{
    // 0. Init
    const int matrix_A_Rows = 3;
    const int matrix_A_Columns = 5;
    std::vector < std::vector<int> >
        matrix_A(matrix_A_Rows, std::vector<int>(matrix_A_Columns));
 
    // 1. Fill a matrix with random values
    for (auto & row : matrix_A)
    {
        std::generate(row.begin(), row.end(), random_number<int>);
    }
 
    // 2. print matrix
    for (const auto & row : matrix_A)
    {
        std::copy(row.begin(), row.end(), std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl;
    }
 
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2017, 18:53
Ответы с готовыми решениями:

а) Создать шаблонную функцию, изменяющую попарно элементы массива следующим образом
а) Создать шаблонную функцию, изменяющую попарно элементы массива следующим образом: ...

Организовать шаблонную функцию для контейнеров
Привет, 1) Нужно организовать шаблонную функцию в которую подается map&lt;int, pair&lt;int ,int&gt;&gt;, и ...

Написать шаблонную функцию для ввода значений
Есть класс, using std::cout; using std::cin; using std::cerr; using std::endl; ...

Реализовать шаблонную функцию для обработки заданной матрицы
Переделать двумерный массив в шаблоны функций#include &quot;stdafx.h&quot; #include &lt;cmath&gt; #include...

8
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.01.2017, 18:58 2
Цитата Сообщение от dailydose Посмотреть сообщение
так и double'ми и т.д.?
Проблема в том, что распределения есть далеко не для всех типов.
И они отличаются. Для double, например, uniform_real_distribution.
Вариант с передачей распределения в качестве параметра подойдёт?

Добавлено через 28 секунд
Иначе нужно проверять через std::is_integral и писать две версии

Добавлено через 2 минуты
Так что
Цитата Сообщение от dailydose Посмотреть сообщение
int'ами, так и double'ми и т.д.?
огласите весь список, пожалуйста.
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
31.01.2017, 19:06  [ТС] 3
Цитата Сообщение от MrGluck Посмотреть сообщение
Иначе нужно проверять через std::is_integral и писать две версии
попробовал наваять что-то подобное, в итоге нормально ни в какую не компилируется
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class T>
T random_number()
{
    static const int FROM_NUM = 1;
    static const int TO_NUM = 9;
    static std::mt19937 generator((unsigned)time(nullptr));
    if (std::is_integral<T>::value)
    {
        std::uniform_int_distribution<int> dist(FROM_NUM, TO_NUM);
        return dist(generator);
    }
 
    std::uniform_real_distribution<double> dist(FROM_NUM, TO_NUM);
    return dist(generator);
}
Цитата Сообщение от MrGluck Посмотреть сообщение
Вариант с передачей распределения в качестве параметра подойдёт?
вот этот вариант думаю более менее нормальный )
сейчас попробую
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.01.2017, 19:13 4
Цитата Сообщение от dailydose Посмотреть сообщение
попробовал наваять что-то подобное, в итоге нормально ни в какую не компилируется
У меня и в mingw и в VS компилируется.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.01.2017, 19:14 5
Цитата Сообщение от dailydose Посмотреть сообщение
Можно ли сделать шаблон для функции random_number, чтобы она заполняла как int'ами, так и double'ми и т.д.?
http://rextester.com/XWIKFP27060
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
#include <iostream>
#include <random>
#include <chrono>
 
template<typename Tp>
Tp random_number(const Tp from, const Tp to)
{
    static std::mt19937 gen(std::chrono::high_resolution_clock::now().time_since_epoch().count());
    std::uniform_real_distribution<> distribution(from, to);
    return static_cast<Tp>(distribution(gen));
}
 
int main()
{
    for(int it = 0; it < 10; ++it)
        std::cout << random_number(1, 10) << ' ';
    
    std::cout << "\n";
    
    for(int it = 0; it < 10; ++it)
        std::cout << random_number(1.f, 10.f) << ' ';
    
    std::cout << "\n";
    
    for(int it = 0; it < 10; ++it)
        std::cout << random_number(1.d, 10.d) << ' ';
}
2
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.01.2017, 19:22 6
Цитата Сообщение от GbaLog- Посмотреть сообщение
.f
GCC extension-ами балуемся?

Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
return static_cast<Tp>(distribution(gen));
Зачем если возвращаемый тип явно указан

Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
std::uniform_real_distribution<> distribution(from, to);
Для long double СЧ могут быть с недостаточным количеством знаков после запятой.
1
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.01.2017, 19:24 7
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

Цитата Сообщение от MrGluck Посмотреть сообщение
GCC extension-ами балуемся?

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
#include <iostream>
#include <random>
#include <chrono>
 
template<typename Tp>
Tp random_number(const Tp from, const Tp to)
{
    static std::mt19937 gen(std::chrono::high_resolution_clock::now().time_since_epoch().count());
    std::uniform_real_distribution<long double> distribution(from, to);
    return distribution(gen);
}
 
int main()
{
    for(int it = 0; it < 10; ++it)
        std::cout << random_number(1, 10) << ' ';
    
    std::cout << "\n";
    
    for(int it = 0; it < 10; ++it)
        std::cout << random_number(1.f, 10.f) << ' ';
    
    std::cout << "\n";
    
    for(int it = 0; it < 10; ++it)
        std::cout << random_number(1., 10.) << ' ';
}
Цитата Сообщение от MrGluck Посмотреть сообщение
Зачем если возвращаемый тип явно указан
Упс.
1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
31.01.2017, 19:26 8
dailydose, вот сюда загляните.
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
01.02.2017, 15:50  [ТС] 9
Цитата Сообщение от MrGluck Посмотреть сообщение
У меня и в mingw и в VS компилируется.
компилиться то компилится, но с предупреждениями
1>------ Build started: Project: cpp_cmd, Configuration: Debug Win32 ------
1> main.cpp
1>d:\prog\cpp\test\cpp_cmd\main.cpp(39): warning C4244: 'argument': conversion from '__int64' to 'unsigned int', possible loss of data
1> d:\prog\cpp\test\cpp_cmd\main.cpp(47): note: see reference to function template instantiation 'Tp random_number<int>(const Tp,const Tp)' being compiled
1> with
1> [
1> Tp=int
1> ]
1>d:\prog\cpp\test\cpp_cmd\main.cpp(41): warning C4244: 'return': conversion from 'long double' to 'int', possible loss of data
1>d:\prog\cpp\test\cpp_cmd\main.cpp(41): warning C4244: 'return': conversion from 'long double' to 'float', possible loss of data
1>d:\prog\cpp\test\cpp_cmd\main.cpp(41): warning C4244: 'return': conversion from 'long double' to 'char', possible loss of data
1> cpp_cmd.vcxproj -> D:\prog\cpp\test\cpp_cmd\Debug\cpp_cmd.exe
1> cpp_cmd.vcxproj -> D:\prog\cpp\test\cpp_cmd\Debug\cpp_cmd.pdb (Full PDB)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
0
01.02.2017, 15:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2017, 15:50
Помогаю со студенческими работами здесь

Jпределить шаблонную функцию для замены трех значений
Помогите определить шаблонную функцию в которой идет замена значений a=b, b=c, c=a

Написать шаблонную функцию, для обработки матриц любого типа
Написать ф-цию по матрицам,превратить в шаблон с тем,чтобы ф-ция обрабатывала матрицу любого типа.

Реализовать шаблонную функцию для нахождения количества локальных минимумов заданной матрицы
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него...

Создать d неповторяющихся рандомных чисел - не могу найти ошибку
Программа должна создавать d не повторяющихся рандомных чисел, от 0 до d-1, которые сохранены в...


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

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