RandomUtils.cs
1 namespace Utils 2 { 3 public static class RandomUtils 4 { 5 private static readonly Random random = new Random(); 6 private static readonly object @lock = new object(); 7 8 public static T GetOneRandom<T>(this T[] items) 9 { 10 lock (@lock) 11 { 12 var i = random.Next(0, items.Length); 13 var result = items[i]; 14 return result; 15 } 16 } 17 18 public static T PickOneRandom<T>(this List<T> remainingItems) 19 { 20 lock (@lock) 21 { 22 var i = random.Next(0, remainingItems.Count); 23 var result = remainingItems[i]; 24 remainingItems.RemoveAt(i); 25 return result; 26 } 27 } 28 29 public static T[] Shuffled<T>(T[] items) 30 { 31 lock (@lock) 32 { 33 var result = new List<T>(); 34 var source = items.ToList(); 35 while (source.Any()) 36 { 37 result.Add(PickOneRandom(source)); 38 } 39 return result.ToArray(); 40 } 41 } 42 43 public static string GenerateRandomString(long requiredLength) 44 { 45 lock (@lock) 46 { 47 var result = ""; 48 while (result.Length < requiredLength) 49 { 50 var remaining = requiredLength - result.Length; 51 var len = Math.Min(1024, remaining); 52 var bytes = new byte[len]; 53 random.NextBytes(bytes); 54 result += string.Join("", bytes.Select(b => b.ToString())); 55 } 56 57 return result.Substring(0, Convert.ToInt32(requiredLength)); 58 } 59 } 60 } 61 }