namespace Utils { public static class RandomUtils { private static readonly Random random = new Random(); private static readonly object @lock = new object(); public static T GetOneRandom(this T[] items) { lock (@lock) { var i = random.Next(0, items.Length); var result = items[i]; return result; } } public static T PickOneRandom(this List remainingItems) { lock (@lock) { var i = random.Next(0, remainingItems.Count); var result = remainingItems[i]; remainingItems.RemoveAt(i); return result; } } public static T[] Shuffled(T[] items) { lock (@lock) { var result = new List(); var source = items.ToList(); while (source.Any()) { result.Add(RandomUtils.PickOneRandom(source)); } return result.ToArray(); } } } }