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

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

Восстановить пароль Регистрация
 
bossman
4 / 4 / 0
Регистрация: 20.06.2010
Сообщений: 147
04.03.2012, 00:13     Класс Random в стиле .Net Framework #1
В программе плотно использую генерацию случайных чисел решил написать класс 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)
{
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 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
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
1477 / 1053 / 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
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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++ Класс для работы со скалярным типом данных в стиле языка Перл
C++ Строки в стиле С
C++ Random и объекты класса (pseudo random)

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
Ответ Создать тему
Опции темы

Текущее время: 04:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru