using System;
namespace TBL.CSharp.Utilities.Random
{
///
/// 随机数扩展工具类
///
public static class Random
{
///
/// 生成非负随机数
///
public static int Next(this IRandom random) => Math.Abs(Math.Max(random.NextRaw(), int.MinValue + 1));
///
/// 生成随机数,并将结果取余到范围内
///
/// 随机数发生器
/// 随机最小值(结果包含)
/// 随机最大值(结果不包含)
/// 生成结果
/// 范围上下界不正确
public static int Next(this IRandom random, int minValue, int maxValue)
{
if (minValue >= maxValue)
throw new ArgumentOutOfRangeException(nameof(minValue),
$"{nameof(minValue)}({minValue}) >= {nameof(maxValue)}({maxValue})");
return minValue + random.Next() % (maxValue - minValue);
}
///
/// 生成 0 ~ 内随机数
///
/// 随机数发生器
/// 随机最大值(结果不包含)
/// 生成结果
/// 范围上下界不正确
public static int Next(this IRandom random, int maxValue) => random.Next(0, maxValue);
///
/// 进行概率取模检定
///
/// 随机数发生器
/// 随机最小值(结果包含)
/// 随机最大值(结果不包含)
/// 检定分界线
/// 随机结果对 的取模值
public static int CheckModule(this IRandom random, int minValue, int maxValue, int line) =>
random.Next(minValue, maxValue) % line;
///
/// 以百分比进行概率取模检定
///
/// 随机数发生器
/// 检定分界线
/// 在范围 0 ~ 100 中生成的随机结果对 的取模值
public static int CheckModulePercent(this IRandom random, int line) =>
random.CheckModule(0, 100, line);
///
/// 进行概率检定
///
/// 随机数发生器
/// 随机最小值(结果包含)
/// 随机最大值(结果不包含)
/// 检定分界线
/// 随机结果是否小于
public static bool Check(this IRandom random, int minValue, int maxValue, int line) =>
random.Next(minValue, maxValue) < line;
///
/// 以百分比进行概率检定
///
/// 随机数发生器
/// 检定分界百分比
/// 在范围 0 ~ 100 中生成的随机结果是否小于
public static bool CheckPercent(this IRandom random, int line) => random.Check(0, 100, line);
}
}