随机数

1:通过Random获取随机数

由System.Random中提供,它生成的数字被称为伪随机数,它是以相同的概率从一组有限的数字中选取的,所选的数字并不具有完全的随机性,但就实用而言,其随机程度已经足够了。
实现思路:
Random random = new Random();
int a=random .Next(1, 100);

2:使用Guid生成随机数

生成速度快,适合大量生成,适合高并发生成
实现思路:
int g= Guid.NewGuid().GetHashCode() % 100;

3:使用DateTime.Now.Ticks生成随机数

DateTime.Now.Ticks的值为自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。
在高并发的情况下会产生相同的随机数,例如在一个for循环中,随机生成100个随机数,这100个随机数可能是一样的。


实现思路:
int a =(int) (DateTime.Now.Ticks % 100);

4:使用RNGCryptoServiceProvider生成随机数

RNGCryptoServiceProvider是使用由密码编译服务供应者 (CSP) 提供的实作 (implementation),实作密码编译随机数生成器 (RNG)。它能产生较Random类比「有限性数学算法」还乱的随机数。
但使用起来比较麻烦,且比较耗时,不建议使用
实现思路:
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
byte[] bb = new byte[4];
rng.GetBytes(bb);
int param = BitConverter.ToInt32(bb,0) % 100 ;

创建自定义规则的随机数

/// <summary>
/// 获取随机数
/// </summary>
public class RandomHelper
{

    public static string RandomNumber()
    {
        return GenerateRandomLetter(3) + GenerateRandomNumber(4); //随机数由3位大写字母+4位数字组成
    }

    private static char[] letter =
    {
        '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'
    };
    private static char[] number =
    {
        '0','1','2','3','4','5','6','7','8','9'
    };

    private static string GenerateRandomLetter(int Length)
    {
        System.Text.StringBuilder newRandom = new System.Text.StringBuilder(Length);
        for (int i = 0; i < Length; i++)
        {
            newRandom.Append(letter[new Random(Guid.NewGuid().GetHashCode()).Next(0, 26)]); //以GUID作为随机数的种子,使用Guid生成随机数,好处是生成速度快,适合大量生成
        }
        return newRandom.ToString();
    }
    private static string GenerateRandomNumber(int Length)
    {
        System.Text.StringBuilder newRandom = new System.Text.StringBuilder(Length);
        for (int i = 0; i < Length; i++)
        {
            newRandom.Append(number[new Random(Guid.NewGuid().GetHashCode()).Next(0, 10)]);
        }
        return newRandom.ToString();
    }
}

随机数返回样例:RQM1689

 

随机数生成工具类

/// <summary>
/// 生成随机数-工具类
/// </summary>
public class RandomHelper
{
    /// <summary>
    /// 通过random.next 获取随机数
    /// </summary>
    /// <param name="min">最小值</param>
    /// <param name="max">最大值</param>
    /// <returns>获取随机数</returns>
    public static int GetNormalRandom(int min,int max)
    {
        if (min >= max || min < 0)
            return min;
        int randomParam = new Random().Next(min,max);
        return randomParam;
    }

    /// <summary>
    /// 通过DateTime.Now.Ticks 获取随机数
    /// </summary>
    /// <param name="min">最小值</param>
    /// <param name="max">最大值</param>
    /// <returns>获取随机数</returns>
    public static int GetDateRandom(int min,int max)
    {
        if (min >= max || min < 0  )
            return min;
        int gapValue = max - min;
        int randomParam=(int)(DateTime.Now.Ticks % gapValue);
        return randomParam+min;
    }

    /// <summary>
    /// 通过Guid 生成随机数
    /// </summary>
    /// <param name="min">最小值</param>
    /// <param name="max">最大值</param>
    /// <returns>获取随机数</returns>
    public static int GetGuidRandom(int min ,int max)
    {
        if (min >= max || min < 0)
            return min;
        int gapValue = max - min;
        int randomParam = (int)(Guid.NewGuid().GetHashCode() % gapValue);
        return randomParam + min;
    }

    /// <summary>
    /// 通过RNGCryptoServiceProvider 生成随机数
    /// </summary>
    /// <param name="min">最小值</param>
    /// <param name="max">最大值</param>
    /// <returns>获取随机数</returns>
    public static int GetRNGCryptoRandom(int min, int max)
    {
        if (min >= max || min < 0)
            return min;
        int gapValue = max - min;

        System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
        byte[] bb = new byte[4];
        rng.GetBytes(bb);
        int randomParam = BitConverter.ToInt32(bb, 0) % gapValue;
        return randomParam + min;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值