2023-06-21 10:06:54 +02:00
|
|
|
|
namespace Utils
|
|
|
|
|
|
{
|
|
|
|
|
|
public static class RandomUtils
|
|
|
|
|
|
{
|
|
|
|
|
|
private static readonly Random random = new Random();
|
2024-09-30 15:23:14 +02:00
|
|
|
|
private static readonly object @lock = new object();
|
2023-06-21 10:06:54 +02:00
|
|
|
|
|
2024-10-10 11:45:04 +02:00
|
|
|
|
public static T GetOneRandom<T>(this T[] items)
|
|
|
|
|
|
{
|
|
|
|
|
|
lock (@lock)
|
|
|
|
|
|
{
|
|
|
|
|
|
var i = random.Next(0, items.Length);
|
|
|
|
|
|
var result = items[i];
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-21 10:06:54 +02:00
|
|
|
|
public static T PickOneRandom<T>(this List<T> remainingItems)
|
|
|
|
|
|
{
|
2024-09-30 15:23:14 +02:00
|
|
|
|
lock (@lock)
|
|
|
|
|
|
{
|
|
|
|
|
|
var i = random.Next(0, remainingItems.Count);
|
|
|
|
|
|
var result = remainingItems[i];
|
|
|
|
|
|
remainingItems.RemoveAt(i);
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
2023-06-21 10:06:54 +02:00
|
|
|
|
}
|
2024-08-20 11:44:15 +02:00
|
|
|
|
|
|
|
|
|
|
public static T[] Shuffled<T>(T[] items)
|
|
|
|
|
|
{
|
2024-09-30 15:23:14 +02:00
|
|
|
|
lock (@lock)
|
2024-08-20 11:44:15 +02:00
|
|
|
|
{
|
2024-09-30 15:23:14 +02:00
|
|
|
|
var result = new List<T>();
|
|
|
|
|
|
var source = items.ToList();
|
|
|
|
|
|
while (source.Any())
|
|
|
|
|
|
{
|
2025-04-10 14:54:49 +02:00
|
|
|
|
result.Add(PickOneRandom(source));
|
2024-09-30 15:23:14 +02:00
|
|
|
|
}
|
|
|
|
|
|
return result.ToArray();
|
2024-08-20 11:44:15 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-10 14:54:49 +02:00
|
|
|
|
|
|
|
|
|
|
public static string GenerateRandomString(long requiredLength)
|
|
|
|
|
|
{
|
|
|
|
|
|
lock (@lock)
|
|
|
|
|
|
{
|
|
|
|
|
|
var result = "";
|
|
|
|
|
|
while (result.Length < requiredLength)
|
|
|
|
|
|
{
|
2025-04-11 08:32:18 +02:00
|
|
|
|
var remaining = requiredLength - result.Length;
|
|
|
|
|
|
var len = Math.Min(1024, remaining);
|
2025-04-10 18:04:06 +02:00
|
|
|
|
var bytes = new byte[len];
|
2025-04-10 14:54:49 +02:00
|
|
|
|
random.NextBytes(bytes);
|
|
|
|
|
|
result += string.Join("", bytes.Select(b => b.ToString()));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-11 08:32:18 +02:00
|
|
|
|
return result.Substring(0, Convert.ToInt32(requiredLength));
|
2025-04-10 14:54:49 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-06-21 10:06:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|