コード例 #1
0
        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);
            }
        }
コード例 #2
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);
        }