プログラムですべての乱数生成を処理するクラスを作成しました。そのクラス内に、配列へのベクトルまたはポインターを取り、それらの要素の 1 つをランダムに選択する関数を実装しようとしています。これらの関数にはテンプレートを使用しているため、任意の型を含む配列またはベクトルから選択できます。
ただし、コンパイルすると (MSVC 2012)、両方のテンプレート関数で「エラー C3861: 'double0to1': identifier not found」というエラーが発生します。double0To1 は、そのクラスのパブリック メンバー関数です。
rng.h で:
#ifndef RNG_H
#define RNG_H
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_real_distribution.hpp>
#include <boost/random/variate_generator.hpp>
#include <vector>
class RNG
{
public:
RNG(int seedIn);
~RNG(void);
double double0To1();
int positiveIntLessThan(int upperBound);
template<class T> T* randomObjectInVector(std::vector<T*> vectorToChooseFrom);
template<class T> T* randomObjectInArray(T** arrayToChooseFrom, int size);
private:
int seed;
boost::random::uniform_real_distribution<double> *distribution0To1;
boost::mt19937 generator;
boost::random::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<double>> *mersenne0To1;
};
template<class T> T* RNG::randomObjectInVector(std::vector<T*> vectorToChooseFrom)
{
double randNum=double0to1();
double step=1/vectorToChooseFrom.size();
int indexToTake=floor(randNum/step);
return vectorToChooseFrom[indexToTake];
}
template<class T> T* RNG::randomObjectInArray(T** arrayToChooseFrom, int size)
{
double randNum=double0to1();
double step=1/size;
int indexToTake=floor(randNum/step);
return &((*arrayToChooseFrom)[indexToTake]);
}
そして rng.cpp で:
#include "stdafx.h"
#include "RNG.h"
RNG::RNG(int seedIn)
{
seed=seedIn;
generator.seed(seed);
distribution0To1=new boost::random::uniform_real_distribution<double>(0, 1);
mersenne0To1=new boost::random::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<double> >(generator, *distribution0To1);
}
RNG::~RNG(void)
{
delete distribution0To1;
}
double RNG::double0To1()
{
return (*mersenne0To1)();
}
int RNG::positiveIntLessThan(int upperBound)
{
double randomValue=double0To1();
return int(upperBound*randomValue);
}