#include "block.h" #include "random.h" #include "math.h" class RandGauss : public Block { private: OutPort < double > * out; Parameter < long > * seed; Parameter < double > * var; double stddevval; Random generator; double gset; // im voraus berechnete Zahl bool iset; // bereits eine Zufallszahl in voraus berechnet? public: RandGauss(const Blockopt & blockopt) : Block(blockopt) {} void makeParameters() { seed = new Parameter < long > (this, "seed", 12345); var = new Parameter < double > (this, "var", 1.); } void makeIOPorts() { out = new OutPort < double > (this, "out", 1); } void initialize() { iset = false; generator.setSeed(seed->value()); stddevval = sqrt(var->value()); } void go() { double fac, rsq, v1, v2; if (iset) { /* Already got one */ iset = false; out->write(stddevval*gset); } else { // Generate TWO evenly distributed numbers between -1 and +1 // that are inside the unit circle do { v1 = 2.0 * generator.getRand() - 1.; v2 = 2.0 * generator.getRand() - 1.; rsq = v1 * v1 + v2 * v2; } while (rsq >= 1.0 || rsq == 0.0); fac = sqrt( -2.0 * log(rsq) / rsq); gset = v1 * fac; iset = true; out->write(stddevval*v2*fac); } } }; PUBLISH(RandGauss);