Пример #1
0
        /// <summary>
        /// Rolls a start and end point--wrapping allowed--and scrambles the elements between.
        /// </summary>
        /// <typeparam name="T">The array data type.</typeparam>
        /// <param name="arry"></param>
        /// <returns>The scrambled array.</returns>
        protected T[] Scramble <T>(T[] arry)
        {
            var N       = arry.Count();
            var newArry = new T[N];

            Array.Copy(arry, newArry, N);

            var start = Stochastic.Next(N);
            var end   = Stochastic.Next(N);

            while (end != start)
            {
                end = Stochastic.Next(N);
            }

            var isWrapped = start > end;
            var offset    = isWrapped ? end + 1 : 0;

            //If isWrapped (N-start) count back end & (start+1) counts front end.
            var len       = end - start + 1 + (isWrapped ? N : 0);
            var scrambled = new T[len];

            for (var i = 0; i < len; i++)
            {
                scrambled[i] = arry[(start + i) % N];
            }

            scrambled = Stochastic.Shuffle(scrambled);

            for (var i = 0; i < len; i++)
            {
                newArry[(start + i) % N] = scrambled[i];
            }

            return(newArry);
        }
 public T[] Shuffle <T>(T[] array)
 {
     return(_stochastic.Shuffle <T>(array));
 }