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)"); }
private double[,] InitializeDataArray(int size) { double[,] data = new double[size, size]; NormalDistribution normalDist = new NormalDistribution(mean, delta); for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { data[i, j] = normalDist.NextDouble(); } } return data; }