/// <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)); }