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

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

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

Студворк — интернет-сервис помощи студентам
Есть код, который заполняет вектор случайными значениями типа 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.01.2017, 18:53
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 2 минуты
Так что
Цитата Сообщение от dailydose Посмотреть сообщение
int'ами, так и double'ми и т.д.?
огласите весь список, пожалуйста.
1
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
31.01.2017, 19:06  [ТС]
Цитата Сообщение от 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Эксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.01.2017, 19:13
Цитата Сообщение от dailydose Посмотреть сообщение
попробовал наваять что-то подобное, в итоге нормально ни в какую не компилируется
У меня и в mingw и в VS компилируется.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
31.01.2017, 19:14
Цитата Сообщение от 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Эксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.01.2017, 19:22
Цитата Сообщение от GbaLog- Посмотреть сообщение
.f
GCC extension-ами балуемся?

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

Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
std::uniform_real_distribution<> distribution(from, to);
Для long double СЧ могут быть с недостаточным количеством знаков после запятой.
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
31.01.2017, 19:24
Лучший ответ Сообщение было отмечено 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Эксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
31.01.2017, 19:26
dailydose, вот сюда загляните.
1
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
01.02.2017, 15:50  [ТС]
Цитата Сообщение от 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.e xe
1> cpp_cmd.vcxproj -> D:\prog\cpp\test\cpp_cmd\Debug\cpp_cmd.p db (Full PDB)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.02.2017, 15:50
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru