using System.Collections.Generic;
public static void Main()
const int trials = 1000000;
Console.WriteLine($"Trials={trials} probability not all values received after n rolls versus observed");
var rn = new Random(1000);
var active = new List<int>() { 0};
for (var trial = 0; trial < trials; trial++)
if (active.Count-1 < ++roll ) active.Add(0);
done = !rolls.Any(x => x == 0);
var sum = active.Sum(x=>x);
var results = active.Select(( x, i)=>
observed: (double) x/ trials,
predicted: (double) inclusionExclusion((uint) i,N)
foreach(var result in results)
Console.WriteLine($"roll {result.roll} predicted {result.predicted} observed probability {result.observed}");
private static double inclusionExclusion(uint trial, uint ndie)
if (trial < ndie) return 1;
double fact = 1.0 / ndie;
for (uint i = 1; i < ndie;i++)
prob += (double) (i % 2 == 1 ? 1:-1) * C(ndie, i) * Math.Pow((ndie - i) * fact, trial);
public static double Factorial(uint n)
return (n > 0) ? Factorial(n - 1) * n : 1;
public static double C(uint n, uint r)
return Factorial(n)/ Factorial(r) / Factorial(n - r) ;