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

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

Войти
Регистрация
Восстановить пароль
 
bossman
4 / 4 / 0
Регистрация: 20.06.2010
Сообщений: 147
#1

Класс Random в стиле .Net Framework - C++

04.03.2012, 00:13. Просмотров 1046. Ответов 6
Метки нет (Все метки)

В программе плотно использую генерацию случайных чисел решил написать класс Random для удобства(только не пишите что это глупо).
Вот только проблема необходимо чтобы функция srand() вызывалась только один раз в конструкторе для любого количества объектов класса. Первая идея создать статическую переменную класса и при её инициализации вызвать srand() , он точно только один раз вызовется. Но мне эта переменная не нужна поэтому решение некрасивое. Существует ли альтернатива? Вот класс и его реализация:
C++
1
2
3
4
5
6
7
8
9
10
11
#include<ctime>
class Random
{
public:
    Random(void);
    ~Random(void);
    int Next(const int maxValue);
    int Next(const int minValue,const int maxValue);
    int Next();
    double NextDouble();
};
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
#include "stdafx.h"
#include "random.h"
 
Random::Random(void)
{
    srand(time(NULL));
}
 
int Random::Next()
{
    return rand();
}
 
int Random::Next(const int maxValue)
{
    int rez=rand()%maxValue;
    return rez;
}
 
int Random::Next(const int minValue, const int maxValue)
{
    if(maxValue>minValue)
    {
        int rez=rand()%(maxValue-minValue)+minValue;
        return rez;
    }
    else
        return 0;
}
 
double Random::NextDouble()
{
    double rez=rand()/(static_cast<double> (RAND_MAX));
    return rez;
}
 
 
Random::~Random(void)
{
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2012, 00:13     Класс Random в стиле .Net Framework
Посмотрите здесь:

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

изменение версии net.framework - C++
Здравствуйте! Подскажите пожалуйста, как изменить версию net.framework для проекта clr (visual studio express 2013)? Ибо приложение не...

Скомпилировать средствами .NET Framework - C++
Иду по адресу G:\Windows\Microsoft.NET\Framework\v4.0.30319, вижу там csc.exe. Как я понимаю это компилятор шарпа. А мне надо...

Установка visual studio ultimate 2012 и .NET Framework 4 - C++
помогите установить visual studio ultimate 2012. при установке на мониторе светится ошибка Microsoft .NET Framework . .NET Framework...

Реализовать функцию (или класс) генерации случайных чисел, используя средства из заголовочника random (C++11) - C++
Хотел написать небольшую обертку над stl-вским рандомом. Уж больно он сложный для использования. Застрял на такой простой вещи: class...

Незнаю что делать с Microsoft Visual Studio 2010. Исключение .Net Framework - C++
Кидаю через буфер обмена код ранее работающий и вот такие дела: 1&gt;------ Построение начато: проект: proba, Конфигурация: Debug Win32...

Строка в стиле С - C++
Чем отличается строка в стиле классического С и С++?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 00:22     Класс Random в стиле .Net Framework #2
можно инициализировать локальную статическую переменную. это почти то же самое, только она будет только в конструкторе. другие варианты без использования глобальных или статических переменных что-то не могу придумать.
и еще наверно более честным будет сделать статическим имено рандомайзер. вдруг понадобятся два разных рандомайзера.
bossman
4 / 4 / 0
Регистрация: 20.06.2010
Сообщений: 147
04.03.2012, 00:34  [ТС]     Класс Random в стиле .Net Framework #3
что имеешь ввиду под рандомайзером? srand. Зачем тогда статический?
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
04.03.2012, 00:40     Класс Random в стиле .Net Framework #4
нечто вроде
http://codepad.org/oeGMXWx4

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class init_random {
public: 
  init_random() { std::cout <<"init" << std::endl; srand(0); }
};
 
class Random
{
public:
        Random(void);
        ~Random(void);
        int Next(const int maxValue);
        int Next(const int minValue,const int maxValue);
        int Next();
        double NextDouble();
private:
        static init_random _g_rand;
};
C++
1
2
3
4
5
init_random Random::_g_rand;
 
Random::Random(void)
{
}
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 00:43     Класс Random в стиле .Net Framework #5
я имел в виду сделать переменную типа Random статической и ее использовать где требуется.
в этом случае, при необходимости, можно будет заюзать отдельные инстансы типа Random. Впрочем это может оказаться ненужным и неудобным.

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

т.е. спп файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace
{
 struct init_random
 {
  public: 
    init_random() { std::cout <<"init" << std::endl; srand(0); }
  };
}
 
Random::Random(void)
{
   static init_random initRnd = init_random();
}
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
04.03.2012, 08:24     Класс Random в стиле .Net Framework #6
Можно реализовать класс Random как Singleton
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2012, 13:48     Класс Random в стиле .Net Framework
Еще ссылки по теме:

Строки в стиле С - C++
Здравствуйте, задумался над одной штукой: можно ли просто написать char* s = &quot;stirng&quot;; или же нужно const char* s = &quot;string&quot;; я...

Строки в стиле C - C++
Добрый вечер, решил поковыряться со строками в стиле C и наткнулся на следующую проблему. В 13-й строке компилятор ругается на то, что...

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

Приведение указателей в стиле си - C++
Здравствуйте, это наверное самый дурацкий вопрос но что значит скобочки в c++ т.е вот например дан код: void* p = (int *)&amp;ip; и что...

Консоль с стиле паскаля - C++
День всем добрый! Мне так, просто интересно стало, как сделать такую же графику в консоли?


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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
04.03.2012, 13:48     Класс Random в стиле .Net Framework #7
проще уж свой генератор написать типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Random
{
public:
   Random()
   {
      state = time(NULL);
      if (!state) state = 1;
   }
   int32_t next() 
   {
      return state = ((state * 1103515245) + 12345) & 0x7fffffff;
   }
private:
   int32_t state;
};
или взять из буста
Yandex
Объявления
04.03.2012, 13:48     Класс Random в стиле .Net Framework
Ответ Создать тему
Опции темы

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