/ Framework / Utils / RandomUtils.cs
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  }