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

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

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

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

04.03.2012, 00:13. Просмотров 1056. Ответов 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)
{
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2012, 00:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс Random в стиле .Net Framework (C++):

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

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

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

Установка 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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 00:22 #2
можно инициализировать локальную статическую переменную. это почти то же самое, только она будет только в конструкторе. другие варианты без использования глобальных или статических переменных что-то не могу придумать.
и еще наверно более честным будет сделать статическим имено рандомайзер. вдруг понадобятся два разных рандомайзера.
0
bossman
4 / 4 / 0
Регистрация: 20.06.2010
Сообщений: 147
04.03.2012, 00:34  [ТС] #3
что имеешь ввиду под рандомайзером? srand. Зачем тогда статический?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
04.03.2012, 00:40 #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)
{
}
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 00:43 #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();
}
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
04.03.2012, 08:24 #6
Можно реализовать класс Random как Singleton
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
04.03.2012, 13:48 #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;
};
или взять из буста
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2012, 13:48
Привет! Вот еще темы с ответами:

Random и объекты класса (pseudo random) - C++
Всем привет. Есть класс: typedef unsigned int ui; class Player { private: ui health;

"Легкий" компилятор C++ без багов и без Net FrameWork бинарников под Windows - C++
Какой компилятор посоветуете? (C++) Сейчас мой проект в VisualStudio 2008. Компилирую в среде Windows 7 64, соответственно компилятор...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

В списке Target Framework не выбирается .NET Framework 4 только .NET Framework 4 Client Profile - .NET
Свойства проекта (Project -&gt; Properties) -&gt; вкладка Compile -&gt; Advenced complie options -&gt; в списке Target Framework не выбирается .NET...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.03.2012, 13:48
Ответ Создать тему
Опции темы

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