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

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

Войти
Регистрация
Восстановить пароль
 
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

uniform_int_distribution или uniform_real_distribution ? - C++

06.12.2012, 23:51. Просмотров 613. Ответов 0

Какая из двух функций fill_random_1 или fill_random_2 эффективней. Имеет ли смысл определять две подобных таких ф-ции или генерить рандомные числа только из uniform_real_distribution в одной ф-ции с преобразованием типа? Вот код:
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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <random>
#include <type_traits>
 
template<typename T>
class Array
{
    T* m_array;
    size_t m_size;
public:
    Array() : m_array(nullptr), m_size(0) {}
    Array(size_t size, int fill = 0) : m_array(new T[size]), m_size(size) {for (size_t i = 0; i<m_size; ++i) m_array[i] = fill;}
    ~Array() {delete[] m_array;}
    void show() const {std::copy(m_array, m_array+m_size, std::ostream_iterator<T>(std::cout, " ")); std::cout<<std::endl<<std::endl;}
    void fill_random_1(int up = 0, int top = 100)
    {
        std::random_device rd;
        std::mt19937 gen(rd());
        if (up>top) std::swap(up, top);
        std::uniform_real_distribution<> real(up, top);
        std::uniform_int_distribution<> intteger(up, top);
        if (std::is_floating_point<T>::value)
        {
            //std::cout<<"floating_point\n";
            for (size_t i = 0; i<m_size; ++i) m_array[i] = real(gen);
        }
        else
        {
            //std::cout<<"integral\n";
            for (size_t i = 0; i<m_size; ++i) m_array[i] = intteger(gen);
        }
    }
 
    void fill_random_2(int up = 0, int top = 100)
    {
        std::random_device rd;
        std::mt19937 gen(rd());
        if (up>top) std::swap(up, top);
        std::uniform_real_distribution<> real(up, top);
        for (size_t i = 0; i<m_size; ++i) m_array[i] = real(gen);
    }
};
 
int main()
{
    Array<int> a_int(10);
    Array<double> b_double(10);
 
    a_int.fill_random_1();
    b_double.fill_random_1();
    a_int.show();
    b_double.show();
 
    a_int.fill_random_2();
    b_double.fill_random_2();
    a_int.show();
    b_double.show();
 
    system("pause");
    return 0;
}
Добавлено через 4 часа 9 минут
Ладно народ, более менее разобрался сам. Провел некие замеры по времени. Результат, конечно, для меня оказался неожиданным - оказывается std::uniform_int_distribution<> работает намного медленней чем std::uniform_real_distribution<> хотя по логике должно было быть наоборот. Вот результаты тестов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    const long long million = 100000000;
    Array<int> a_int(million);
    Array<double> b_double(million);
 
    clock_t t=clock();
 
    //b_double.fill_random_1();  //15
    //b_double.fill_random_2();  //15
    //a_int.fill_random_1();     //34
    //a_int.fill_random_2();     //15
 
    int time=(clock()-t)/CLOCKS_PER_SEC;
    std::cout<<"time = "<<time<<"\n";
 
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 23:51     uniform_int_distribution или uniform_real_distribution ?
Посмотрите здесь:

Количество нулевых, или положительных, или отрицательных элементов в двумерном массиве - C++
Здравствуйте. Мне нужно составить программу, которая подсчитывает или количество нулевых, или количество положительных, или количество...

Написать программу вычисления площади треугольники или квадрата или трапеции - C++
написать программу вычисления площади треугольники или квадрата или трапеции в соответствии с выбором пользователя с использованием меню!

Контроль точности Рунге-Кутта (3 или 4 порядка) или Эйлера. - C++
Вопрос таков, как можно контролировать точность в Рунге-Кутта 3 или Рунге-Кутта 4 порядка. Или в методе Эйлера. Искал в интернете и...

Книги или справочники для опытных(или проффесиональных) программистов! - C++
Пожалуйста, Подскажите книги или справочники для опытных и проффесиональных программистов! Особенно хотелось бы найти: 1) полный...

Вложенные CMap или CArray-объекты. Ошибка компилятора или неправильная работа. - C++
Имеется: struct OPER { CString name; //название CString symbol; //обозначение };

Придумать и описать создание списка или стека или очереди. И работу с ними. - C++
Помогите пожалуйста. Придумать и описать структуру некоторого сюжета (не менее пяти полей) и составить программу для создания массива...

При вводе элементов массива выводить их тип (или int или float) - C++
Помогите с ошибкой, и если не сложно то с заданием а то я вроде сделал только не могу проверить так как крешит прогу( А задание...

Создать программу при нажатии на кнопку м или ж выводились муржской или женский пол. - C++
Создать программу при нажатии на кнопку м или ж выводились муржской или женский пол.

Или я дурак или лыжи не едут, склоняюсь к первому. - C++
говорит необъявленный идентификатор относительно всех функций класса notebook. Пробовал все конструкторы методов перекинуть в хедер эффект...

Нужен простой пример передачи одной функции или метода в другую функцию или метод - C++
Собственно сабж. Не знаю, как сделать. Как это выглядит синтаксически? Пробовал по разному но не получается Пробовал так. Покажите...

При вводе того или иного пароля открывать тот или иной txt-файл - C++
Добрый вечер. Нужно написать программу, которая будет при вводе того или иного пароля открывать тот или иной .txt файл. Например: ...

Определить лежит ли точка внутри или вне круга,ограниченного указанной окружностью, или на окружности - C++
помогите пожалуйста)) Даны координаты точки (x,y), радиус r и координаты центра окружности (x,y. Определить лежит ли точка внутри или...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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