예제 #1
0
        public static void SetPermutations(out int[,] perms, int numVal, int combLength)
        {
            int size = (int)Math.Round(Fn.BinomialCoefficient(numVal, combLength), 0);

            perms = new int[size, combLength];
            for (int j = 0; j < perms.GetLength(1); j++)
            {           //erste zeile beginnt immer mit: 0 1  2 ...
                perms[0, j] = j;
            }
            int remainder = 0;

            for (int i = 1; i < perms.GetLength(0); i++)
            {
                int div = numVal;
                int j   = perms.GetLength(1);
                while (--j >= 0)
                {
                    perms[i, j] = perms[i - 1, j];              //default, letzte zeile kopieren
                }
                j         = perms.GetLength(1) - 1;
                remainder = (perms[i - 1, j] + 1) % div;
                if (remainder != 0)
                {
                    perms[i, j] = perms[i - 1, j] + 1;          //default, nur letzten wert erhöhen
                }
                else
                {
                    while (remainder == 0 && --j >= 0)
                    {   //überlauf, zurück bis kein überlauf mehr
                        remainder = (perms[i - 1, j] + 1) % (--div);
                    }
                    if (j >= 0)                                         //j<0 --> absoluter überlauf --> Fehler
                    {
                        perms[i, j] = perms[i - 1, j] + 1;              // wert erhöhen
                    }
                    while (++j < perms.GetLength(1) && j > 0)
                    { // und nachfolger immer um (mind) eins höher
                        perms[i, j] = perms[i, j - 1] + 1;
                    }
                }
            }
        }
예제 #2
0
 ProbabilityMass(int x)
 {
     return(Fn.BinomialCoefficient(_n, x) * Math.Pow(_p, x) * Math.Pow(1 - _p, _n - x));
 }