/// <summary> /// Generate massive of normal distribution /// </summary> /// <param name="n">N</param> /// <param name="iseed">Iseed number</param> /// <returns>Massive of normal random numbers</returns> public List<double> GenCustomNormal(int n, int iseed = 2147483646) { // Save primal number to create output list var curN = n; if (n % 2 != 0) { n++; } // Local variables int i; // For custom random method var random = new CustomRandom(iseed); // Parameter adjustments var massive = new double[n]; // Body of normal var nn = n; var m = n - (n / 2 << 1); if (m != 0) { --nn; } var i1 = nn; for (i = 0; i < i1; i += 2) { L1: var u = random.GenRandNumbCustom(); var v = random.GenRandNumbCustom(); u = u + u - 1; v = v + v - 1; var sum = u * u + v * v; if (sum >= 1) { goto L1; } var sln = (float)Math.Log(sum); sln = (float)Math.Sqrt(((-sln - sln) / sum)); massive[i] = u * sln; massive[i + 1] = v * sln; } var massNormaList = new List<double>(); for (var j = 0; j < curN; j++) { massNormaList.Add(massive[j]); } return massNormaList; }
/// <summary> /// Approximate calculation of the integral /// </summary> /// <returns></returns> public double Integral() { var random = new CustomRandom(Environment.TickCount); var underGraph = 0; const int accuracy = 1000000; for (var i = 0; i < accuracy; i++) { var randNumberX = random.GenRandNumbCustom(); var randNumberY = random.GenRandNumbCustom(); underGraph = Y(randNumberX) > randNumberY ? underGraph + 1 : underGraph; } return Convert.ToDouble((double)underGraph/accuracy); }