public void TestAccumulatorNumericStability() { /* NOTE: Statistically it is possible that this test fails even * if everything works as expected. However, it's very unlikely to happen, * and even more unlikely to happen in a series. */ Accumulator accumulator = new Accumulator(); NormalDistribution gaussian = new NormalDistribution(); // Test around 0, no stability issues expected gaussian.SetDistributionParameters(0, 1); for(int i = 0; i < 10000; i++) { accumulator.Add(gaussian.NextDouble()); } Assert.That(accumulator.Mean, NumericIs.AlmostEqualTo((double) 0, 0.2), "Mean of (0,1)"); Assert.That(accumulator.Variance, NumericIs.AlmostEqualTo((double) 1, 0.5), "Variance of (0,1)"); // Test around 10^9, potential stability issues accumulator.Clear(); gaussian.SetDistributionParameters(1e+9, 1); for(int i = 0; i < 10000; i++) { accumulator.Add(gaussian.NextDouble()); } Assert.That(accumulator.Mean, NumericIs.AlmostEqualTo(1e+9, 0.2), "Mean of (1e+9,1)"); Assert.That(accumulator.Variance, NumericIs.AlmostEqualTo((double) 1, 0.5), "Variance of (1e+9,1)"); }
/// <summary> /// Create a gaussian noise source with normally distributed amplitudes. /// </summary> /// <param name="uniformWhiteRandomSource">Uniform white random source.</param> /// <param name="mean">mu-parameter of the normal distribution</param> /// <param name="standardDeviation">sigma-parameter of the normal distribution</param> public WhiteGaussianNoiseSource( RandomSource uniformWhiteRandomSource, double mean, double standardDeviation ) { NormalDistribution gaussian = new NormalDistribution(uniformWhiteRandomSource); gaussian.SetDistributionParameters(mean, standardDeviation); _distribution = gaussian; }