获取随机数工具类
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()解决

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现