C# 生成随机数(工具类)

在项目和面试过程中,经常都会遇到随机数的问题,在这根据经验和网上资料总结一份,方便日后需要。

1.通过Random获取随机数

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

2.使用Guid生成随机数

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

3.使用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 ;

4.使用DateTime.Now.Ticks生成随机数

DateTime.Now.Ticks的值为自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。
实现思路:
int a =(int) (DateTime.Now.Ticks % 100);

具体工具类,能直接进行使用

/// <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;
        }
    }
针对Random和DateTime.Now.Ticks在高并发的情况下会产生相同的随机数,

如:

使用Random

在这里插入图片描述
问题:多次使用Random产生随机数,产生了同样的随机数
解决方案:
(1)使用同一个Random实例
在这里插入图片描述
(2)使用Thread().sleep
在这里插入图片描述

使用DateTime.Now.Ticks

1.在程序运行时间太快时也会存在获取的多个随机数数值相同的情况,如下
在这里插入图片描述
问题:多次获取DateTime.Now.Ticks用于产生随机数,产生了同样的随机数
原因:因为DateTime.Now.Ticks 表示的即为一个时间间隔数,连续几行程序执行比较快的时候,就大体可以看作同一时间,获取的值也相同。
解决方案:
1.使用Thread.sleep()解决
在这里插入图片描述

  • 6
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MelanceXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值