public void Compute(string input, List <char> buffer, System.Action <IList <char>, int, bool> shuffle, int iterations, bool guaranteeDiscontinuity, int shuffles)
    {
        samples.Clear();
        samples.Capacity = shuffles;

        for (int i = 0; i < shuffles; i++)
        {
            buffer.Clear();
            buffer.AddRange(input);
            shuffle(buffer, iterations, guaranteeDiscontinuity);
            samples.Add(buffer.ToConcatenatedString());
        }

        orderedPair.Compute(input, samples, shuffles * (input.Length - 1), s =>
        {
            var observations = 0;

            for (int i = 1; i < input.Length; i++)
            {
                if (s[i] - s[i - 1] == 1)
                {
                    observations++;
                }
            }

            return(observations);
        });

        lastToFirst.Compute(input, samples, shuffles, s =>
        {
            return(s[0] == input[input.Length - 1] ? 1 : 0);
        });

        indexContinuity.Compute(input, samples, shuffles * input.Length, s =>
        {
            var observations = 0;

            for (int i = 0; i < input.Length; i++)
            {
                if (input.IndexOf(s[i]) == i)
                {
                    observations++;
                }
            }

            return(observations);
        });
    }