Существует k различных равномерных распределений целочисленного типа. Диапазоны не обязательно совпадают, скажем dist1~U(0,10), dist2~U(0,5), etc. Я использую uniform_int_distribution класс в C ++ 14. Вот мой код:

#include <vector>
#include <random>

using namespace std;

int main() {
  vector<int> distRange = {4,5,2,4};
  vector< uniform_int_distribution<int> > U(distRange.size(),uniform_int_distribution<int>(0,1));

  for (int i=0; i<distRange.size(); i++)
    U[i].param( uniform_int_distribution<int>(0,distRange[i]).param() );

  return 0;
}

Как мы видим, я создал новый объект для изменения параметров. Есть ли более дешевый способ (количество наборов текста или меньшее время работы) сделать это?

0
user3813057 2 Янв 2018 в 04:09

2 ответа

Лучший ответ

Экземпляры param_type не предназначены для изменения. Типу не предоставлен API. Я не думаю, что у него есть точный тип, т.е. определенная реализация. Таким образом, нет законного способа установить параметры, инстанциировать их с желаемыми или взять копию набора параметров из другого распределения.

Но вы можете создавать свои дистрибутивы на месте в векторе с желаемыми параметрами:

#include <vector>
#include <random>

using namespace std;

int main() {
  vector<int> distRange = {4,5,2,4};
  vector< uniform_int_distribution<int> > U;

  for(auto&& max : distRange) {
    U.emplace_back(0, max);
  }
  return 0;
}

Emplace вызовет конструктор, передающий параметры. Таким образом, в каждом цикле создается uniform_int_distribution непосредственно с параметрами, которые вы хотите, с использованием специального c'tor, вместо того, чтобы создавать фиктивный экземпляр для сброса параметров позже.


Для полноты: если вы действительно хотите пойти по пути param_type, вы можете пропустить создание дистрибутивных копий и создать временный:

#include <vector>
#include <random>

using namespace std;

int main() {
  vector<int> distRange = {4,5,2,4};
  vector< uniform_int_distribution<int> > U(distRange.size());

  for (int i=0; i<distRange.size(); i++)
    U[i].param(uniform_int_distribution<int>::param_type(0,distRange[i]));

  return 0;
}

Это кажется излишним, поскольку param_type c'tor гарантированно отражает его c'tor дистрибутива, поэтому он просто вводит временный вызов другого c'tor, предназначенного для работы таким же образом. Звучит запутанно, и это так.

0
luk32 2 Янв 2018 в 02:29
#include <vector>
#include <random>
using namespace std;

auto main()
    -> int
{
    using Distr = uniform_int_distribution<int>;

    vector<Distr> u;
    for( int const b : {4,5,2,4} )
    {
        u.emplace_back( 0, b );
    }
}
0
Cheers and hth. - Alf 2 Янв 2018 в 02:55