using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace LifePayment.Domain.Shared;
|
|
public static class GlobalRandom
|
{
|
// 字符集
|
private static readonly string LowerCase = "abcdefghijklmnopqrstuvwxyz";
|
private static readonly string UpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
private static readonly string Digits = "0123456789";
|
private static readonly string Symbols = "~`!@#$%^&*\\|()_-+=\\、{}\\[\\]'\"<>?.,:;/";
|
|
/// <summary>
|
/// 获取指定位数的随机数
|
/// </summary>
|
/// <param name="length"></param>
|
/// <returns></returns>
|
public static string GetRandomNum(int length)
|
{
|
|
var ranInt = 0;
|
var minAMax = GetMinAndMaxNumByLength(length);
|
|
ranInt = Random.Shared.Next(minAMax.Min, minAMax.Max + 1);
|
|
return ranInt.ToString().PadLeft(length, '0');
|
}
|
|
/// <summary>
|
/// 获取指定位数的十进制数的最大值和最小值
|
/// </summary>
|
/// <param name="length"></param>
|
/// <param name="isOneMin"></param>
|
/// <returns></returns>
|
/// <exception cref="ArgumentException"></exception>
|
public static (int Min, int Max) GetMinAndMaxNumByLength(int length, bool minIsOne = true)
|
{
|
if (length <= 0) throw new ArgumentException("length必须大于等于0");
|
|
if (length == 0) return (0, 0);
|
|
var min = minIsOne ? 1 : (int)Math.Pow(10, length - 1);
|
var max = (int)Math.Pow(10, length) - 1;
|
return (min, max);
|
}
|
|
/// <summary>
|
/// 根据指定长度和字符池获取指定长度的随机字符串
|
/// </summary>
|
/// <param name="length"></param>
|
/// <param name="charPool"></param>
|
/// <returns></returns>
|
public static string GetRandomStrFromCharPool(int length, char[] charPool)
|
{
|
string result = null;
|
|
if (length > 0 && charPool.IsNotNullOrEmpty())
|
{
|
Shuffle(charPool);
|
for (int i = 0; i < length; i++)
|
{
|
result += charPool[Random.Shared.Next(0, charPool.Length)];
|
}
|
}
|
|
return result;
|
}
|
|
/// <summary>
|
/// 获取随机密码
|
/// </summary>
|
/// <param name="length"></param>
|
/// <param name="charPool"></param>
|
/// <returns></returns>
|
public static string GetRandomPassword(int minLenth = 6, int maxLenth = 6)
|
{
|
// 生成一个合法的字符串长度
|
int length = minLenth == maxLenth ? minLenth : Random.Shared.Next(minLenth, maxLenth + 1); // 6 到 16 的随机长度
|
|
// 至少包含一个字母、数字和符号
|
var sb = new StringBuilder();
|
sb.Append(LowerCase[Random.Shared.Next(LowerCase.Length)]); // 加一个小写字母
|
sb.Append(UpperCase[Random.Shared.Next(UpperCase.Length)]); // 加一个大写字母
|
sb.Append(Digits[Random.Shared.Next(Digits.Length)]); // 加一个数字
|
//sb.Append(Symbols[Random.Shared.Next(Symbols.Length)]); // 加一个符号
|
|
// 填充其余字符
|
var allChars = LowerCase + UpperCase + Digits;
|
for (int i = sb.Length; i < length; i++)
|
{
|
sb.Append(allChars[Random.Shared.Next(allChars.Length)]);
|
}
|
|
// 打乱字符顺序,以确保字符种类不被集中在前面
|
return new string(sb.ToString().OrderBy(c => Random.Shared.Next()).ToArray());
|
}
|
|
/// <summary>
|
/// 随机洗牌
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="array"></param>
|
public static void Shuffle<T>(T[] array)
|
{
|
Random rng = new Random();
|
int n = array.Length;
|
for (int i = n - 1; i > 0; i--)
|
{
|
int j = rng.Next(i + 1);
|
(array[i], array[j]) = (array[j], array[i]); // 交换元素
|
}
|
}
|
|
}
|