在項目開發中,一般都會使用到“随機數”,但是在DotNet中的随機數并非真正的随機數,可在一些情況下生成重複的數字,現在總結一下在項目中生成随機數的方法。
1.随機布爾值:
/// <summary>
/// 随機布爾值
/// </summary>
/// <param name="random"></param>
/// <returns>随機布爾值</returns>
public static bool NextBoolean(this Random random)
{
if (random == null)
{
throw new ArgumentNullException("random");
}
return random.NextDouble() > 0.5;
}
2.指定枚舉類型的随機枚舉值:
/// <summary>
/// 指定枚舉類型的随機枚舉值
/// </summary>
/// <param name="random"></param>
/// <returns>指定枚舉類型的随機枚舉值</returns>
public static T NextEnum<T>(this Random random) where T : struct
{
var type = typeof(T);
if (!type.IsEnum)
{
throw new InvalidOperationException();
}
var array = System.Enum.GetValues(type);
var index = random.Next(array.GetLowerBound(0), array.GetUpperBound(0) + 1);
return (T)array.GetValue(index);
}
3.随機數填充的指定長度的數組:
/// <summary>
/// 随機數填充的指定長度的數組
/// </summary>
/// <param name="random"></param>
/// <param name="length">數組長度</param>
/// <returns>随機數填充的指定長度的數組</returns>
public static byte[] NextBytes(this Random random, int length)
{
if (length < 0)
{
throw new ArgumentOutOfRangeException("length");
}
var data = new byte[length];
random.NextBytes(data);
return data;
}
4. 數組中的随機元素:
/// <summary>
/// 數組中的随機元素
/// </summary>
/// <typeparam name="T">元素類型</typeparam>
/// <param name="random"></param>
/// <param name="items">元素數組</param>
/// <returns>元素數組中的某個随機項</returns>
public static T NextItem<T>(this Random random, T[] items)
{
return items[random.Next(0, items.Length)];
}
5.指定時間段内的随機時間值:
/// <summary>
/// 指定時間段内的随機時間值
/// </summary>
/// <param name="random"></param>
/// <param name="minValue">時間範圍的最小值</param>
/// <param name="maxValue">時間範圍的最大值</param>
/// <returns>指定時間段内的随機時間值</returns>
public static DateTime NextDateTime(this Random random, DateTime minValue, DateTime maxValue)
{
var ticks = minValue.Ticks + (long)((maxValue.Ticks - minValue.Ticks) * random.NextDouble());
return new DateTime(ticks);
}
6. 随機時間值:
/// <summary>
/// 随機時間值
/// </summary>
/// <param name="random"></param>
/// <returns>随機時間值</returns>
public static DateTime NextDateTime(this Random random)
{
return NextDateTime(random, DateTime.MinValue, DateTime.MaxValue);
}
7.擷取指定的長度的随機數字字元串:
/// <summary>
/// 擷取指定的長度的随機數字字元串
/// </summary>
/// <param name="random"></param>
/// <param name="length">要擷取随機數長度</param>
/// <returns>指定長度的随機數字元串</returns>
public static string GetRandomNumberString(this Random random, int length)
{
if (length < 0)
{
throw new ArgumentOutOfRangeException("length");
}
char[] pattern = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
var result = "";
var n = pattern.Length;
for (var i = 0; i < length; i++)
{
var rnd = random.Next(0, n);
result += pattern[rnd];
}
return result;
}
/// <summary>
/// 擷取指定的長度的随機字母字元串
/// </summary>
/// <param name="random"></param>
/// <param name="length">要擷取随機數長度</param>
/// <returns>指定長度的随機字母組成字元串</returns>
public static string GetRandomLetterString(this Random random, int length)
{
if (length < 0)
{
throw new ArgumentOutOfRangeException("length");
}
char[] pattern =
{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
};
var result = "";
var n = pattern.Length;
for (var i = 0; i < length; i++)
{
var rnd = random.Next(0, n);
result += pattern[rnd];
}
return result;
}
/// <summary>
/// 擷取指定的長度的随機字母和數字字元串
/// </summary>
/// <param name="random"></param>
/// <param name="length">要擷取随機數長度</param>
/// <returns>指定長度的随機字母和數字組成字元串</returns>
public static string GetRandomLetterAndNumberString(this Random random, int length)
{
if (length < 0)
{
throw new ArgumentOutOfRangeException("length");
}
char[] pattern =
{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
};
var result = "";
var n = pattern.Length;
for (var i = 0; i < length; i++)
{
var rnd = random.Next(0, n);
result += pattern[rnd];
}
return result;
}