using System.Collections.Generic;
static Random rng = new Random();
public static int[] GeneratePermutation(int n)
for (int i = 0; i < n; i++) perm[i] = i;
for (int i = n - 1; i > 0; i--)
public static List<int> GetCycleLengths(int[] perm)
bool[] visited = new bool[n];
List<int> cycleLengths = new List<int>();
for (int i = 0; i < n; i++)
cycleLengths.Add(length);
public static List<int> SimulateLongestCycle(int n, int trials)
List<int> longestCycles = new List<int>();
for (int t = 0; t < trials; t++)
int[] perm = GeneratePermutation(n);
List<int> cycles = GetCycleLengths(perm);
foreach (int len in cycles)
if (len > max) max = len;
public static void Main()
List<int> results = SimulateLongestCycle(n, trials);
Dictionary<int, int> counts = new Dictionary<int, int>();
foreach (int length in results)
if (!counts.ContainsKey(length)) counts[length] = 0;
Console.WriteLine($"Simulation of {trials} trials with {n} prisoners:\n");
foreach (var pair in new SortedList<int, int>(counts))
double percentage = 100.0 * pair.Value / trials;
Console.WriteLine($"Longest cycle = {pair.Key}: {pair.Value} times ({percentage:F2}%)");
Console.WriteLine("\n--- Cumulative Probability Summary ---");
Console.WriteLine($"Success (Longest cycle ≤ {n / 2}): {successCount} times ({(100.0 * successCount / trials):F2}%)");
Console.WriteLine($"Failure (Longest cycle > {n / 2}): {failureCount} times ({(100.0 * failureCount / trials):F2}%)");