public static int BinaryProbabilityMethod(double p, HSMPQApplication.PRNGMode RngMode) /*Реализует вероятностный выбор. Наудачу кидается число и по нему выбирается * нужное состояние.*/ { if (p == 0D) { return(0); } int s = 1; double x; double aux = p; //while (aux < 10) //{ // aux = aux * 10; // s = s * 10; //} switch (RngMode) { case HSMPQApplication.PRNGMode.Random: x = (float)r.NextDouble(); break; case HSMPQApplication.PRNGMode.RNGCryptoServiceProvider: x = (float)Rnd(); break; case HSMPQApplication.PRNGMode.RC4: x = (float)rc4_Rnd(); break; default: x = 0; break; } if (x < aux) { return(1); } else { return(0); } }
public static int ProbabilityMethod(double[] a, HSMPQApplication.PRNGMode RngMode) /*Реализует вероятностный выбор. Наудачу кидается число и по нему выбирается * нужное состояние. * Будет использоваться дважды - при выборе состояния канала(параметром * будет вектор финальных вероятностей) и при выборе нужного символа * (параметром будет вектор полученный с использованием матрицы условных * вероятностей и означающий полную верояность появления того или иного символа */ { if (a == null || a.Length == 0) { return(0); //подумать!!! } int i; int s = 1; int n = a.Length; double[] aux = new double[n]; for (i = 0; i < n; i++) { aux[i] = a[i]; } //while (MinElementOfArray(aux) < 10) //{ // for (i = 0; i < n; i++) // aux[i] = aux[i] * 10; // s = s * 10; //} for (i = 1; i < n - 1; i++) { aux[i] = aux[i - 1] + aux[i]; } aux[n - 1] = s; double x; switch (RngMode) { case HSMPQApplication.PRNGMode.Random: x = (double)r.NextDouble(); break; case HSMPQApplication.PRNGMode.RNGCryptoServiceProvider: x = (double)Rnd(); break; case HSMPQApplication.PRNGMode.RC4: x = (double)rc4_Rnd(); break; default: x = 0; break; } /* Console.WriteLine("xxx"); * Console.WriteLine(x.ToString());*/ int index = -1; if ((x >= 0) && (x < aux[0])) { index = 0; } else { for (i = 1; i < n; i++) { if ((x >= aux[i - 1]) && (x < aux[i])) { index = i; } } }; if (x == aux[n - 1]) { index = n - 1; } /* Console.WriteLine("prob result"); * Console.WriteLine(index.ToString());*/ return(index); }