void RNG::setSeed(int seed) { mt.init_genrand(seed); // Ein Mersennetwister braucht bei schlechten seeds bis zu // 600 Durchlaeufe um auf Temperatur zu kommen. for (int lauf = 0; lauf < 600; ++lauf) nextGaussian(); }
double InverseGaussian::sample() { double v = nextGaussian(); // sample from a normal distribution with a mean of 0 and 1 standard deviation double y = v*v; double x = m_dMu + (m_dMu * m_dMu * y) / (2* m_dScale) - (m_dMu/(2*m_dScale)) * sqrt(4*m_dMu*m_dScale*y + m_dMu*m_dMu*y*y); double test = cokus.random01(); // sample from a uniform distribution between 0 and 1 if (test <= (m_dMu)/(m_dMu + x)) return x; else return (m_dMu*m_dMu) / x; }