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; } } } }
ProbabilityMass(int x) { return(Fn.BinomialCoefficient(_n, x) * Math.Pow(_p, x) * Math.Pow(1 - _p, _n - x)); }