std::discrete_distribution
クラス コンストラクターに渡されたデータを使用してオブジェクトを作成しようとしています。静的データを使用してこれを作成する方法は知っていますが、変数データを (きれいに) 使用する方法を理解できません。私が今持っているものは「機能」していますが、痛いです。これを行うより適切な方法はありますか?
distInit = { distArray[0], ... };
ラインが問題です。
#include <iostream>
#include <iomanip>
#include <initializer_list>
#include <map>
#include <random>
class Die {
private:
int loadSide;
double loadAmount;
std::mt19937 generator;
std::discrete_distribution<> distribution;
std::initializer_list<double> distInit;
std::array<double, 7> distArray;
public:
Die( int loadSide, double loadAmount ) : loadSide(loadSide), loadAmount(loadAmount) {
distArray.fill( 1 );
distArray[0] = 0;
distArray[this->loadSide] = this->loadAmount;
distInit = { distArray[0], distArray[1], distArray[2], distArray[3], distArray[4], distArray[5], distArray[6] };
distribution.param( distInit );
};
int roll( ) {
return distribution( generator );
};
};
const int ROUNDS = 10000;
int main() {
Die* die = new Die( 5, 20 );
std::map<int, int> m;
for(int n=0; n < ROUNDS; n++) {
m[die->roll()]++;
}
for(auto p : m) {
std::cout << p.first << " generated " << std::setiosflags(std::ios::fixed) << std::setprecision(2) << (float) p.second / ROUNDS << " times\n";
}
}
適切な質問をしていない可能性があります。その場合は事前にお詫び申し上げます。これは可能性が高いです。なぜなら、この件に関する (明らかに) 関連するヒットが見つからないことに驚いているからです。
私のコンパイラはg++-mp-4.8 (MacPorts gcc48 4.8-20130411_0) 4.8.1 20130411 (prerelease)
コマンドライン/opt/local/bin/g++-mp-4.8 -std=c++11 test.cpp -o test