std :: generate — Как мне использовать генератор случайных чисел?

В моем программировании мне нужно создать определяемые пользователем количество ублас векторов. Я хотел бы сделать это с

«Станд :: генерировать». Однако я получаю ошибки компилятора, которые делают это невозможным для меня.

Код, который я использую, это:

for (size_t a_= 0; a_ < p_; a_++)
{
ublas::vector<double> next_vhat(size_of_vec);
std::generate(next_vhat.begin(), next_vhat.end(), mygen.give_rnd);
v_hat_.push_back(next_vhat);
}

Я должен был создать class специально для вызова функции, так как std::generate не позволит мне использовать функцию с аргументом в качестве третьего аргумента («gen», см. Вот. Мне нужно, чтобы числа были нормально распределены, поэтому вызов функции для функции распределения должен содержать в качестве аргумента генератор случайных чисел. Поскольку он не позволял мне вызывать это с аргументом, мне пришлось написать класс, чтобы сделать это для меня.

Класс, который я написал, это:

class RandGen
{
public:
RandGen()
: generator()
, norm_dist(0.0,1.0)
, random_seed(static_cast<unsigned>(std::time(NULL)))
{}

double give_rnd() { return (double) norm_dist(generator); }

private:
base_gen_t generator;
boost::random::normal_distribution<double> norm_dist; //Standard normal    distribution
unsigned random_seed;
};

При попытке скомпилировать все это, я получаю следующую ошибку:

 error: cannot convert ‘RandGen::give_rnd’ from type ‘double (RandGen::)()’ to type ‘double (RandGen::*)()’

Я понятия не имею, что компилятор хочет, чтобы я делал здесь, или почему у него столько проблем с этим вообще. Любой совет очень ценится.

2

Решение

Вам нужно передать вызываемый объект. То есть либо указатель на функцию (не указатель на функцию-член, что mygen.give_rnd есть) или объект класса, который перегружает operator(), Вы можете просто изменить свою функцию give_rnd к этому:

double operator()() { return (double) norm_dist(generator); }

А потом просто передайте свой объект непосредственно std::generate

std::generate(..., ..., mygen);

Если по какой-то причине вы хотели сохранить RandGen класс как таковой, вам нужно будет обернуть его в другой функтор или лямбду:

std::generate(..., ..., [&mygen]() { return mygen.give_rnd(); });
10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]