public DistributionTestFunc(VectorType type, string name, string randomFuncName, string funcArgs, double avg, double variance) : base(type, name) { var dtype = new VectorType(BuiltinType.TypeDouble, type.Components); var code = new List <string>(); code.Add($"var random = new Random({AbstractType.Random.Next()});"); code.Add($"var sum = {dtype.Construct(dtype, dtype.ZeroValue)};"); code.Add($"var sumSqr = {dtype.Construct(dtype, dtype.ZeroValue)};"); code.Add(""); code.Add("const int count = 50000;"); code.Add("for (var _ = 0; _ < count; ++_)"); code.Add("{"); code.Add($" var v = {type.Name}.{randomFuncName}(random{(string.IsNullOrEmpty(funcArgs) ? "" : ", " + funcArgs)});"); code.Add($" sum += ({dtype.Name})v;"); code.Add($" sumSqr += glm.Pow2(({dtype.Name})v);"); code.Add("}"); code.Add(""); code.Add("var avg = sum / (double)count;"); code.Add("var variance = sumSqr / (double)count - avg * avg;"); code.Add(""); for (var c = 0; c < type.Components; ++c) { code.Add($"Assert.AreEqual(avg.{type.ArgOf(c)}, {avg}, 1.0);"); } code.Add(""); for (var c = 0; c < type.Components; ++c) { code.Add($"Assert.AreEqual(variance.{type.ArgOf(c)}, {variance}, 3.0);"); } Code = code; }